Можно ли вставить строку, но только если значение еще не существует? - PullRequest
16 голосов
/ 13 ноября 2008

Можно ли вставить строку, но только если одно из значений, уже имеющихся в таблице, не существует?

Я создаю Рассказать другу с реферальными баллами для системы электронной торговли, где мне нужно вставить адрес электронной почты друга в таблицу базы данных, но только если его еще нет в таблице , Это потому, что я не хочу, чтобы только 1 человек получал реферальные баллы, когда новый клиент регистрируется и что-то покупает. Поэтому я хочу, чтобы в таблице было только одно электронное письмо.

Я использую PHP 4 и MySql 4.1.

Ответы [ 7 ]

33 голосов
/ 13 ноября 2008

Это работает, если у вас есть уникальный индекс или первичный ключ для столбца (EmailAddr в этом примере):

INSERT IGNORE INTO Table (EmailAddr) VALUES ('test@test.com')

Используя это, если запись с таким адресом электронной почты уже существует (нарушение дублирующего ключа) вместо ошибки, оператор просто не выполняется и ничего не вставляется.

См. MySql документы для получения дополнительной информации.

21 голосов
/ 13 ноября 2008

Если столбец является первичным ключом или уникальным индексом:

INSERT INTO table (email) VALUES (email_address) ON DUPLICATE KEY UPDATE
email=email_address

Зная мою удачу, есть лучший способ сделать это. AFAIK, в MySQL нет эквивалента "ON DUPLICATE KEY DO NOTING". Я не уверен насчет бита email = email_Address, вы можете поиграть и посмотреть, работает ли он без указания действия. Однако, как кто-то заявляет выше, если он имеет уникальные ограничения, то ничего не произойдет в любом случае. И если вы хотите, чтобы все адреса электронной почты в таблице были уникальными, нет необходимости указывать их как уникальные в определении столбца.

5 голосов
/ 13 ноября 2008

Скорее всего что-то вроде:

IF NOT EXISTS(SELECT * FROM myTable WHERE Email=@Email) THEN INSERT INTO blah blah

Это можно свернуть в один запрос к базе данных.

3 голосов
/ 24 мая 2009

Небольшое изменение / дополнение к ответу Наеблиса:

INSERT INTO table (email) VALUES (email_address)
ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id)

Таким образом, вам не нужно добавлять туда email=email_address и , вы получите правильное значение для LAST_INSERT_ID(), если оператор обновится.

Источник: Документы MySQL: 12.2.5.3

1 голос
/ 13 ноября 2008

MySQL предлагает ЗАМЕНА НА http://dev.mysql.com/doc/refman/5.0/en/replace.html:

REPLACE работает точно так же, как INSERT, за исключением того, что если старая строка в таблице имеет то же значение, что и новая строка для ПЕРВИЧНЫЙ КЛЮЧ или УНИКАЛЬНЫЙ индекс, старая строка удаляется перед новой строкой вставлен.

1 голос
/ 13 ноября 2008

Я не уверен, что получил, но как насчет

try {
  mysql_query($sql);
}
catch(Exception $e) {

}

в сочетании с уникальным индексом поля в MySQL?

если выдается исключение, вы знаете, что получили дублированное поле. Извините, если это не отвечает на ваш вопрос ..

0 голосов
/ 13 ноября 2008

Если поле электронной почты было первичным ключом, то ограничения таблицы не позволят ввести дубликат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...