Можно ли вставить строку, но только если значение еще не существует?

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

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

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

Solutions Collecting From Web of "Можно ли вставить строку, но только если значение еще не существует?"

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

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

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

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

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

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

Дополнительную информацию см. В документах MySql .

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

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

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

Небольшая модификация / дополнение к ответу naeblis:

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

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

Источник: MySQL Docs: 12.2.5.3

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

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

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

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

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

MySQL предлагает REPLACE INTO http://dev.mysql.com/doc/refman/5.0/en/replace.html :

REPLACE работает точно так же, как INSERT, за исключением того, что если старая строка в таблице имеет то же значение, что и новая строка для индекса PRIMARY KEY или UNIQUE, старая строка будет удалена до того, как будет вставлена ​​новая строка.