Можно ли вставить строку, но только если значение еще не существует?
Можно ли вставить строку, но только если одно из значений, уже существующих в таблице, не существует?
Я создаю Tell A Friend с реферальными точками для электронной коммерции, где мне нужно вставить электронную почту друга в таблицу базы данных, но только если она еще не существует в таблице. Это потому, что я не хочу, чтобы один человек получал реферальные баллы, как только новый клиент подписывается и что-то покупает. Поэтому я хочу, чтобы в таблице было только одно электронное письмо.
Я использую PHP 4 и MySql 4.1.
Ответы
Ответ 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, вы можете поиграть и посмотреть, работает ли это без необходимости указывать действие. Однако, если кто-то заявляет выше, если у него есть уникальные ограничения, в любом случае ничего не произойдет. И если вы хотите, чтобы все адреса электронной почты в таблице были уникальными, нет никаких оснований указывать его как уникальное в определении столбца.
Ответ 2
Это работает, если у вас есть уникальный индекс или первичный ключ в столбце (EmailAddr в этом примере):
INSERT IGNORE INTO Table (EmailAddr) VALUES ('[email protected]')
Используя это, если запись с этим письмом уже существует (дублирующее нарушение ключа) вместо ошибки, оператор просто терпит неудачу и ничего не вставлено.
Подробнее см. Документы MySql.
Ответ 3
Скорее всего что-то вроде:
IF NOT EXISTS(SELECT * FROM myTable WHERE [email protected]) THEN INSERT INTO blah blah
Это может быть свернуто в один запрос к базе данных.
Ответ 4
Небольшое изменение/дополнение к наивному ответу:
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
Ответ 5
Я не уверен, получил ли я его, но как насчет
try {
mysql_query($sql);
}
catch(Exception $e) {
}
в сочетании с уникальным индексом поля в MySQL?
если он выдает исключение, вы знаете, что у вас есть дублируемое поле.
Извините, если это не ответит на ваш вопрос..
Ответ 6
Если поле электронной почты было первичным ключом, ограничения в таблице прекратили бы дублирование.
Ответ 7
MySQL предлагает ЗАМЕНИТЬ В http://dev.mysql.com/doc/refman/5.0/en/replace.html:
REPLACE работает точно так же, как INSERT, за исключением того, что если старая строка в таблице имеет такое же значение, как новая строка для ПЕРВИЧНЫЙ КЛЮЧ или УНИКАЛЬНЫЙ индекс, старая строка удаляется перед новой строкой вставляется.