Возможно ли вставить строку, но только если одно из значений, уже существующих в таблице, не существует?
Я создаю Tell A Friend с реферальными точками для электронной коммерции, где мне нужно вставить электронную почту друга в таблицу базы данных, но только если она еще не существует в таблице. Это потому, что я не хочу, чтобы один человек получал реферальные баллы, как только новый клиент подписывается и что-то покупает. Поэтому я хочу, чтобы в таблице было только одно электронное письмо.
Я использую PHP 4 и MySql 4.1.
Если столбец является первичным ключом или уникальным индексом:
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, старая строка будет удалена до того, как будет вставлена новая строка.