Как предотвратить дублирование вставок в таблицу

Я хочу вставить данные в Mysql, и когда данные уже находятся в таблице, его не следует вставлять снова. Как предотвратить вторую вставку?

try { $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); // set the PDO error mode to exception $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = "INSERT INTO MyGuests(firstname, lastname, email) VALUES ('John', 'Doe', 'john@example.com')"; // use exec() because no results are returned $conn->exec($sql); echo "Table MyGuests created successfully"; } catch(PDOException $e) { echo $sql . "<br>" . $e->getMessage(); } $conn = null; 

Результат выглядит так:

введите описание изображения здесь

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

Можно выпустить INSERT IGNORE, который перемещается вдоль дублированного нарушения, как будто ничего не происходит (это очень неоправданно, и в вашем случае это невозможно, потому что вашего уникального ограничения по электронной почте нет). Основная проблема с этим заключается в том, что ваши тенденции (читайте: вероятно, будут) теряют контроль над потоком происходящего и останутся с нежелательными данными. Поэтому не используйте его, если вы не профессионал.

Можно выпускать и INSERT ON DUPLICATE KEY UPDATE (иначе IODKU), который также требует уникального ключа (может быть и уникальным композитом). Таким образом, новая строка не будет возникать, кроме обновления строки. В качестве примера можно было бы вставить новую строку с 4 столбцами, но при нарушении дублирования обновление можно было выполнить только на двух столбцах, таких как

предполагая ниже PK для невидимого id int столбца id int и уникальный ключ для emailAddr

 insert person(firstName,lastName,emailAddr) values 'Joe','Smith','jsmith@email.com' on duplicate key update firstName='Joe',lastName='Smith' 

Это уникальный ключ в emailAddr, который делает эту работу. Осталось всего 1 строка на адрес электронной почты, когда-либо.

Таким образом, у вас может быть неограниченный Джо Смитс, но только 1 строка на адрес электронной почты.

Таблица создания для приведенной выше таблицы может выглядеть так:

 create table person ( id int auto_increment primary key, firstName varchar(50) not null, lastName varchar(50) not null, emailAddr varchar(150) not null, unique key(emailAddr) -- without this, IODKU will not work ); 

Вы также можете выдать команды ALTER TABLE для добавления ограничений после создания таблицы. В зависимости от данных в этом случае вызов может завершиться неудачей.

Mysql Insert on Duplicate Key Update и Alter Table .

Я скажу это снова, без правильной настройки схемы, IODKU не будет работать, и у вас останутся нежелательные строки. Так что не ленитесь об этом. Сначала настройте схему, чтобы она успела (с уникальными ключами), затем переходите к использованию IODKU.

Вам нужно добавить уникальное ограничение / индекс и игнорировать ошибки, вызванные дублированием. Если это ваш запрос:

 INSERT INTO MyGuests(firstname, lastname, email) VALUES ('John', 'Doe', 'john@example.com'); 

И вы хотите, чтобы все три столбца не были вставлены повторно, вы можете добавить уникальное значение как:

 create unique index unq_myguests_firstname_lastname_email on myguests(firstname, lastname, email); 

Затем произнесите insert как:

 INSERT INTO MyGuests(firstname, lastname, email) VALUES ('John', 'Doe', 'john@example.com') ON DUPLICATE KEY UPDATE firstname = VALUES(firstname); 

Раздел ON DUPLICATE KEY UPDATE ничего не делает, кроме игнорирования ошибок.