Вставить запрос, проверить, существует ли запись. Если нет, вставьте ее

У меня есть таблица mysql _1 _...

+----+---------------+
| id |    ip_addr    |
+----+---------------+
|  1 | 192.168.100.1 |
|  2 | 192.168.100.2 |
|  3 | 192.168.100.3 |
|  4 | 192.168.100.4 |
|  5 | 192.168.100.5 |
+----+---------------+

Я хочу добавить только те записи, которых нет в столбце ip_addr. Например

У меня есть следующие записи, которые нужно добавить в ip_addr таблицу

192.168.100.6
192.168.100.10
192.168.100.11
192.168.100.1   //already in column
192.168.100.12

Я не хочу добавлять 192.168.100.1, потому что он уже находится в столбце.

Итак, возможно ли, чтобы INSERT запрос сначала проверял записи, а затем вставлял их?

В настоящее время я делаю это с ... сначала я SELECT записи, затем сопоставляю их, а затем INSERT.

но я хочу сделать только один запрос.


person Sumit Bijvani    schedule 09.04.2013    source источник
comment
это запись из другой таблицы /.   -  person John Woo    schedule 09.04.2013
comment
Вы можете добавить уникальный индекс в столбец ip, и тогда у вас останется INSERT .. ON DUPLICATE KEY или INSERT IGNORE   -  person Dale    schedule 09.04.2013
comment
сделать ip_addr как поле unique   -  person Suhel Meman    schedule 09.04.2013
comment
не могли бы вы просто добавить уникальный индекс в ip_addr   -  person Manoj Purohit    schedule 09.04.2013
comment
@ все, что я знаю о ключе unique   -  person Sumit Bijvani    schedule 09.04.2013
comment
@JW могу я сделать это без unique key?   -  person Sumit Bijvani    schedule 09.04.2013
comment
На мой взгляд, лучше было бы добавить уникальное ограничение для столбца.   -  person John Woo    schedule 09.04.2013
comment
@YogeshSuthar, да, вот чего я хочу, позволь мне проверить, работает он или нет   -  person Sumit Bijvani    schedule 09.04.2013
comment
Как это сделать, не делая столбец ip_addr уникальным? @casperOne: Это НЕ повторяющийся вопрос. То, на что вы ссылаетесь, требует использования первичного ключа. ЭТОГО вопроса нет.   -  person not2qubit    schedule 29.10.2013


Ответы (5)


Вы можете использовать запрос ниже. Здесь он вставит ip_address, если его нет в вашей таблице.

INSERT INTO ip_list (ip_addr)
SELECT * FROM (SELECT '192.168.100.1') AS tmp
WHERE NOT EXISTS (
    SELECT ip_addr FROM ip_list WHERE ip_addr='192.168.100.1'
);
person Yogesh Suthar    schedule 09.04.2013
comment
Число экач йогеш бхау. - person Freelancer; 09.04.2013
comment
+1 за ваш ответ, спасибо :) - person Sumit Bijvani; 09.04.2013
comment
@YogeshSuthar еще раз спасибо :) - person Sumit Bijvani; 09.04.2013
comment
Я хотел сделать это около 10 лет, но никогда не думал об этом в Google. Только что согласился выполнить 2 запроса - выберите, затем вставьте. это превосходно! - person James Wilson; 05.04.2016
comment
Супер метод. Есть ли способ расширить это до нескольких значений за один раз? Например, проверьте, существуют ли 192.168.100.1 и 192.168.100.2, иначе вставьте оба. - person HopeKing; 22.05.2017

Вы должны добавить УНИКАЛЬНЫЙ ключ на ip_addr, а затем использовать INSERT IGNORE.

Возможно, это поможет, если вы еще не слышали о UNIQUE: http://www.tutorialspoint.com/sql/sql-unique.htm

person mrks    schedule 09.04.2013
comment
+1 за ваш ответ, спасибо - person Sumit Bijvani; 09.04.2013

на вашем месте я наложил бы UNIQUE ограничение на столбец,

ALTER TABLE ip_list ADD CONSTRAINT IP_Unique UNIQUE(ip_addr)
person Skinny Pipes    schedule 09.04.2013
comment
+1 за ваш ответ, спасибо - person Sumit Bijvani; 09.04.2013

вы можете сделать это с помощью Insert ... при обновлении повторяющегося ключа

OR

в качестве альтернативы вы также можете использовать Заменить

person Suresh Kamrushi    schedule 09.04.2013
comment
+1 за ваш ответ, спасибо - person Sumit Bijvani; 09.04.2013
comment
Замени, какое гениальное изобретение! Спасибо - person Oscar Zarrus; 25.01.2020

Попробуйте использовать инструкцию MySQL INSERT IGNORE.

person Peter Kiss    schedule 09.04.2013
comment
+1 за ваш ответ, спасибо - person Sumit Bijvani; 09.04.2013