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

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
16
0
23 519
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

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

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

}

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

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

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

alex 13.11.2008 03:47

Если выбрано исключение, строка не будет добавлена. Можно просто залогиниться, или в улове ничего не делать.

Feet 13.11.2008 03:50

Но с предыдущим запросом он каждый раз вызывал ошибку. Я хотел, чтобы в mySql происходил тихий сбой.

alex 13.11.2008 03:55

Это хороший подход к решению проблемы за пределами БД, но он не решает проблему в БД, которая, возможно, является тем местом, где об этом следует позаботиться.

Jeremiah Peschka 13.11.2008 04:03

@Jeremiah Peschka - Мудрые слова

alex 13.11.2008 04:12

AFAIK mysql_query() никогда не генерирует исключения при возникновении ошибки SQL, поэтому я не думаю, что это сработало бы как есть?

MrWhite 10.01.2014 18:39

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

Ответ принят как подходящий

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

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

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

Я установил для электронной почты уникальный ключ в phpMyAdmin, а затем использовал ваш код. И это отлично сработало! Спасибо

alex 13.11.2008 03:54

Re: нет эквивалента ON DUPLICATE KEY DO NOTHING. См. Решение Тодда. В качестве альтернативы вы, вероятно, могли бы сделать что-то вроде ON DUPLICATE KEY UPDATE email = email, хотя это, безусловно, более расточительно.

Artem Russakovskii 24.05.2009 07:40

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

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

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

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

INSERT IGNORE INTO Table (EmailAddr) VALUES ('[email protected]')

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

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

«INSERT IGNORE» - лучший ответ, но REPLACE (dev.mysql.com/doc/refman/5.0/en/replace.html) также является вариантом, если вы хотите повторно вставить строку по какой-либо причине (возможно, триггер временной метки или что-то в этом роде).

gpojd 14.11.2008 06:19

Будьте осторожны с REPLACE, увеличивая ваш автоинкремент - под капотом это просто DELETE, INSERT.

Artem Russakovskii 24.05.2009 07:39

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

REPLACE works exactly like INSERT, except that if an old row in the table has the same value as a new row for a PRIMARY KEY or a UNIQUE index, the old row is deleted before the new row is inserted.

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

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

Другие вопросы по теме