mysql insert если нет такой записи
Mysql insert если нет такой записи
Иногда требуется вставить запись в таблицу, если её там до сих пор нет. Можно сделать пару запросов: одним —проверить, другим — вставить, а можно и одним:
Поле login должно быть уникальным.
Комментарии RSS по email OK
Andrey, а почему не replace?
Shadow
REPLACE будет перетирать существующие данные, не пропускать, как в случае с INSERT IGNORE.
Оу… сорри, не заметил начала сообщения 🙂
Sam, ну мы как бы не об аналоге говорим, а о похожих случаях. Никто не спорит, что оно не работает аналогично.
. Можно сделать пару запросов: одним —проверить, другим — вставить.
Ни в коем случае так делать нельзя! Это грубая ошибка. Между первым запросом и вторым пройдет какое-то время. Вполне может оказать, что именно в этот промежуток другой процесс создаст записей, в отсутствии которой вы только что убедились.
век живи век учись 🙂
Алексей, в mysql, если я не ошибаюсь, есть транзакции. А до транзакций для этой цели существовала блокировка таблиц, которая работает и сейчас. То есть в самой проверке-вставке никакой грубой ошибки нет. Другое дело, что это повышает вероятность ошибки из-за того, что программист забудет вставить блокировку, или забудет вовремя разблокировать таблицу.
Проверка и обновление в два запроса в одной транзакции зато гораздо более переносимое решение.
Век живи-век учись. Спасибо. Пригодилось
Отлично, спасибо за пример, очень пригодилось.
Уже не первый день с SQL, и вроде бы такой простой вопрос, а вот только что нашел решение. Большое спасибо!
Спасибо, у меня получилось, пока не поставил нужное поле PRIMARY KEY или UNIQUE.
Здравствуйте а как быть если до вставки ещё выполняется много функций, как перед их выполнением проверить на дубликат с помощью INSERT IGNORE INTO? Вот кучу дублей на собиралось
Как выполнить запрос «INSERT IF NOT EXIST» в MySQL?
У меня есть таблица с 14 миллионами записей. Если я хочу добавить больше данных в том же формате, есть ли способ гарантировать, что запись, которую я хочу вставить, еще не существует, без использования пары запросов (т. е. один запрос для проверки и один – для вставки)?
Гарантирует ли ограничение unique поля при выполнении insert отказ выполнения, если оно уже существует?
Ответ 1
В последней версии MySQL синтаксис, представленный в вопросе, невозможен. Но есть несколько очень простых способов добиться того, что ожидается, используя существующие функции.
Есть 3 возможных решения: использовать INSERT IGNORE, REPLACE или INSERT… ON DUPLICATE KEY UPDATE.
Итак, у нас есть таблица:
CREATE TABLE `transcripts` (
`ensembl_transcript_id` varchar(20) NOT NULL,
`transcript_chrom_start` int(10) unsigned NOT NULL,
`transcript_chrom_end` int(10) unsigned NOT NULL,
PRIMARY KEY (`ensembl_transcript_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Теперь представьте, что у нас есть автоматический конвейер, импортирующий метаданные транскриптов из Ensembl, и что по разным причинам конвейер может сломаться на любом этапе выполнения. Таким образом, нам нужно обеспечить две вещи:
повторные запуски конвейера не уничтожат нашу базу данных ;
повторное выполнение не прекратится из-за ошибок «дублирования первичного ключа».
Метод 1: использование REPLACE
REPLACE INTO `transcripts`
SET `ensembl_transcript_id` = ‘ENSORGT00000000001’,
Если запись существует, она будет перезаписана; если ее еще нет, она будет создана. Однако в нашем случае использование этого метода неэффективно: нам не нужно перезаписывать существующие записи, их можно просто пропустить.
Метод 2: использование INSERT IGNORE:
INSERT IGNORE INTO `transcripts`
SET `ensembl_transcript_id` = ‘ENSORGT00000000001’,
Этот второй метод имеет несколько потенциальных недостатков, включая невозможность прерывания запроса в случае возникновения какой-либо другой проблемы. Таким образом, его следует использовать, если ранее не было ключевого слова IGNORE.
Метод 3: использование INSERT… ON DUPLICATE KEY UPDATE:
Ответ 2
Решение:
INSERT INTO `table` (`value1`, `value2`)
SELECT ‘stuff for value1’, ‘stuff for value2’ FROM DUAL
WHERE NOT EXISTS (SELECT * FROM `table`
WHERE `value1`=’stuff for value1′ AND `value2`=’stuff for value2′ LIMIT 1)
Объяснение:
SELECT * FROM `table`
WHERE `value1`=’stuff for value1′ AND `value2`=’stuff for value2′ LIMIT 1
SELECT ‘stuff for value1’, ‘stuff for value2’ FROM DUAL
INSERT INTO `table` (`value1`, `value2`)
вставляет данные, если они были возвращены промежуточным запросом.
Ответ 3
Вот функция PHP, которая вставит строку, только если все указанные значения столбцов еще не существуют в таблице.
Если один из столбцов отличается, строка будет добавлена.
Если таблица пуста, строка будет добавлена.
Если существует строка, в которой все указанные столбцы имеют указанные значения, строка не будет добавлена.
MySQL: вставить запись, если не существует в таблице
Я пытаюсь выполнить следующий запрос:
15 ответов
Я на самом деле не предлагаю вам делать это, как как полагают Piskvor и другим-это гораздо лучший способ сделать это, но вы можете на самом деле делать то, что вы пытались:
попробуйте вставить ту же запись еще раз:
вставить другую запись:
что вы можете сделать: создать UNIQUE INDEX на поле, которое должно быть уникальным ( name ), а затем использовать:
MySQL предоставляет очень милое решение:
очень прост в использовании, так как вы объявили уникальный первичный ключ (здесь со значением 5).
здесь запрос mysql, который вставляет записи, если не существует и будет игнорировать существующие подобные записи.
Если вы действительно не можете получить уникальный индекс в таблице, вы можете попробовать.
чтобы преодолеть подобную проблему, я сделал таблицу, которую я вставляю, чтобы иметь уникальный столбец. Используя Ваш пример, при создании у меня было бы что-то вроде:
а затем используйте следующий запрос при вставке в него:
Вы можете легко использовать следующим образом :
таким образом, вы можете вставить новая raw и если у вас есть дубликаты данных, замените определенный столбец ( лучшие столбцы-это временные метки ).
Например :
этот запрос работает правильно:
и вы можете создать таблицу, используя следующий запрос:
Примечание: создайте таблицу, используя второй запрос, прежде чем пытаться использовать первый запрос.
Брайан Хупер : Вы почти попали в точку, но у вас есть ошибка в вашем synatx. Ваша вставка никогда не будет работать. Я тестировал свою базу данных и вот правильный ответ:
Я даю вам мой пример y таблица. Вставка почти такая же, как написал Бьян Хупер, за исключением того, что я поставил select FROM DUAL ont из другой таблицы. СДР с уважением, Иван
вы вставляете, не обновляя результат. Можно определить столбец name в основном столбце или задать его как уникальный.
У меня была проблема, и метод, который Майк посоветовал, работал частично, у меня была ошибка Dublicate Column name = ‘0’, и изменил синтаксис вашего запроса как это’
проблема заключалась в именах столбцов. sum3 был равен sum4 и mysql бросил имена столбцов дубликата, и я написал код в этом синтаксисе, и он работал отлично,
у меня была аналогичная проблема, и мне нужно было вставить несколько, если не существует. Итак, из приведенных выше примеров я пришел к этой комбинации. он здесь на случай, если кому-то понадобится.
уведомления: Я должен был определить имя везде, как требовал MSSQL. MySQL работает с * тоже.
в MySQL: СОЗДАТЬ ТАБЛИЦУ names ( OID инт(11) не null типа AUTO_INCREMENT, name varchar (32) сопоставить utf8_unicode_ci не NULL, ПЕРВИЧНЫЙ КЛЮЧ ( OID ), УНИКАЛЬНЫЙ КЛЮЧ name_UNIQUE ( name ) ) Двигатель=InnoDB в типа AUTO_INCREMENT=1;
в MSSQL: Создать таблицу [имена] ( [OID] INT IDENTITY (1, 1) NOT NULL, [name] NVARCHAR (32) NOT NULL, КЛАСТЕРИЗОВАННЫЙ ПЕРВИЧНЫЙ КЛЮЧ ([OID] ASC) ); Создать уникальный некластеризованный индекс [Index_Names_Name] на [names] ([name] ASC);
этот запрос можно использовать в PHP-код.
у меня есть столбец ID в этой таблице, поэтому мне нужно проверить дублирование для всех столбцов, кроме этого столбца ID:
и теперь новый элемент будет добавлен только в случае, если не существует строки со значениями, настроенными в SET строка
Вставка записи, если ее нету
Нужно в один запрос сделать следующее:
Проверить существование записи в таблице с определенным userId (TEXT), если запись с таким userId существует, то вернуть (выбрать) все данные по этой записи, а если нету, то вставить запись (с определенным набором данных) в таблицу и вернуть данные по этой записе (которую только что вставили).
Как такое можно сделать?
Как восстановить БД если нету бэкапа?
Привет. Суть такова. Раньше у меня стояла Win 8 и был установлен MySQL сервер. На этом сервере была.
Doberman1983, MySQL работает по принципу клиент-сервер. Есть MySQL Сервер, который может одновременно работать с многими Клиентами. Каждый Клиент, который подключается к Серверу, посылает Серверу Запросы. Сервер отвечает Клиенту на его Запросы.
Запросы от разных Клиентов Сервер может выполнять, как ему будет удобнее. Следовательно, между запросом №1 и последующим запросом №2 от одного и того же Клиента Сервер может еще выполнить еще Nцать Запросов от других Клиентов, если это потребуется и он захочет и сможет.
Возвращаясь к сути вопроса, для выборки данных существует запрос SELECT, а для добавления записей в таблицу есть запрос INSERT. Это два разных отдельных запроса. Моя мысль была в том, что обычным решением «в лоб» будет неправильно выполнить сначала SELECT для поиска нужной(-ых) записи(-ей), затем что-то проверять и принимать решение, делать INSERT или нет. Пока Клиент будет принимать решение, быть или не быть, Сервер возмет, да и обработает Запросы от других Клиентов, в связи с чем принятое данным Клиентом решение может стать неактуальным.
MySQL: вставить запись, если не существует в таблице
Я пытаюсь выполнить следующий запрос:
16 ответов
Попробуйте снова вставить одну и ту же запись:
Вставьте другую запись:
Что вы можете сделать: создайте UNIQUE INDEX в поле, которое должно быть уникальным ( name ), затем используйте либо:
MySQL предоставляет очень милые решения:
Очень проста в использовании, так как вы объявили уникальный первичный ключ (здесь со значением 5).
Здесь запрос mysql, который вставляет записи, если не существует, и будет игнорировать существующие аналогичные записи.
Если вы действительно не можете получить уникальный индекс в таблице, вы можете попробовать.
Чтобы преодолеть подобную проблему, я сделал таблицу, которую я вставляю, чтобы иметь уникальный столбец. Используя ваш пример, при создании я бы хотел что-то вроде:
а затем используйте следующий запрос при вставке в него:
Этот запрос работает хорошо:
И вы можете создать таблицу, используя следующий запрос:
Примечание. Создайте таблицу, используя второй запрос, прежде чем пытаться использовать первый запрос.
вы можете легко использовать следующий путь:
Брайан Хупер: Вы почти достигли точки, но у вас есть ошибка в вашем синтаксисе. Ваша вставка никогда не будет работать. Я тестировал свою базу данных и вот правильный ответ:
Я даю вам мой пример таблицы y. Вставка почти такая же, как писал Биан Хупер, за исключением того, что я помещаю select FROM DUAL ont из другой таблицы. С уважением, Иван
У меня была проблема, и метод, с которым Майк советовал отчасти отчасти, имел ошибку Dublicate Column name = ‘0’ и изменил синтаксис вашего запроса как это `
Проблема заключалась в именах столбцов. sum3 был равен sum4, а mysql выбрал имена дубликатов столбцов, и я написал код в этом синтаксисе, и он отлично работал,
Вы вставляете, не обновляя результат. Вы можете определить столбец имен в первичном столбце или установить его уникальным.
Этот запрос может быть использован в PHP-коде.
У меня есть столбец идентификатора в этой таблице, поэтому мне нужно проверить дублирование для всех столбцов, кроме этого столбца идентификатора:
и теперь новый элемент будет добавлен только в случае, если не существует строки со значениями, сконфигурированными в строке SET
У меня была аналогичная проблема, и мне нужно было вставить несколько, если они не были. Поэтому из приведенных выше примеров я пришел к этой комбинации. это здесь на всякий случай, если кому-то это понадобится.
Примечание: Мне нужно было определять имя везде, где MSSQL требовал его. MySQL работает с * тоже.
MySQL: CREATE TABLE names ( OID int (11) NOT NULL AUTO_INCREMENT, name varchar (32) COLLATE utf8_unicode_ci NOT NULL, ПЕРВИЧНЫЙ КЛЮЧ ( OID ), УНИКАЛЬНЫЙ КЛЮЧ name_UNIQUE ( name ) ) ENGINE = InnoDB AUTO_INCREMENT = 1;
MSSQL: CREATE TABLE [имена] ( [OID] INT IDENTITY (1, 1) NOT NULL, [имя] NVARCHAR (32) NOT NULL, ПЕРВИЧНАЯ КЛАВИАТУРА ([OID] ASC) ); CREATE UNIQUE NONCLUSTERED INDEX [Index_Names_Name] ON [имена] ([имя] ASC);