Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 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, за исключением того, что если старая строка в таблице имеет такое же значение, как новая строка для ПЕРВИЧНЫЙ КЛЮЧ или УНИКАЛЬНЫЙ индекс, старая строка удаляется перед новой строкой вставляется.