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);

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *