Intereting Posts

MySQL – игнорировать ошибку вставки: дублировать запись

Я работаю в PHP.

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

Есть ли способ сначала сделать SELECT и посмотреть, есть ли запись там до INSERT – и INSERT, только если SELECT не возвращает записи? Надеюсь нет.

Я хотел бы как-то сказать MySQL игнорировать эти вставки без каких-либо ошибок.

спасибо

Вы можете использовать синтаксис INSERT … IGNORE, если вы не хотите предпринимать никаких действий, если есть дублирующаяся запись.

Вы можете использовать синтаксис REPLACE INTO, если вы хотите переписать старую запись на новую с тем же ключом.

Или вы можете использовать INSERT … ON DUPLICATE KEY UPDATE синтаксис, если вы хотите выполнить обновление записи вместо того, чтобы встретить дубликат.

Edit: Думал, я бы добавил несколько примеров.

Примеры

Скажем, у вас есть таблица с именем tbl с двумя столбцами, id и value . Существует одна запись, id = 1 и value = 1. Если вы выполните следующие инструкции:

 REPLACE INTO tbl VALUES(1,50); 

У вас все еще есть одна запись с id = 1 значением = 50. Обратите внимание, что вся запись сначала была удалена, а затем снова вставлена. Затем:

 INSERT IGNORE INTO tbl VALUES (1,10); 

Операция выполняется успешно, но ничего не вставлено. У вас все еще есть id = 1 и значение = 50. В заключение:

 INSERT INTO tbl VALUES (1,200) ON DUPLICATE KEY UPDATE value=200; 

Теперь у вас есть одна запись с id = 1 и значением = 200.

Вы можете использовать триггеры .

Также ознакомьтесь с этим руководством по внедрению триггеров .

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

Как выглядит схема базы данных?

Вы можете добавить столбец идентификатора, который будет автоматически увеличиваться для каждой вставки, чтобы гарантировать уникальные строки.

Вопрос: Я настраиваю базу данных с клиентами. Я знаю, что вы используете инструкцию «insert» для вставки информации в базу данных, но как я могу убедиться, что я не буду вводить одну и ту же информацию о клиенте снова?

Ответ. Вы можете убедиться, что вы не вставляете дублируемую информацию, используя условие EXISTS.

Например, если у вас была таблица с именами клиентов с первичным ключом client_id, вы могли бы использовать следующий оператор:

 INSERT INTO clients (client_id, client_name, client_type) SELECT supplier_id, supplier_name, 'advertising' FROM suppliers WHERE not exists (select * from clients where clients.client_id = suppliers.supplier_id); 

Этот оператор вставляет несколько записей с подзапросом.

Если вы хотите вставить одну запись, вы можете использовать следующую инструкцию:

 INSERT INTO clients (client_id, client_name, client_type) SELECT 10345, 'IBM', 'advertising' FROM dual WHERE not exists (select * from clients where clients.client_id = 10345); 

Использование двойной таблицы позволяет вводить ваши значения в операторе select, даже если значения в настоящее время не хранятся в таблице.

с http://www.techonthenet.com/sql/insert.php

 $duplicate_query=mysql_query("SELECT * FROM student") or die(mysql_error()); $duplicate=mysql_num_rows($duplicate_query); if($duplicate==0) { while($value=mysql_fetch_array($duplicate_query) { if(($value['name']==$name)&& ($value['email']==$email)&& ($value['mobile']==$mobile)&& ($value['resume']==$resume)) { echo $query="INSERT INTO student(name,email,mobile,resume)VALUES('$name','$email','$mobile','$resume')"; $res=mysql_query($query); if($query) { echo "Success"; } else { echo "Error"; } else { echo "Duplicate Entry"; } } } } else { echo "Records Already Exixts"; } в $duplicate_query=mysql_query("SELECT * FROM student") or die(mysql_error()); $duplicate=mysql_num_rows($duplicate_query); if($duplicate==0) { while($value=mysql_fetch_array($duplicate_query) { if(($value['name']==$name)&& ($value['email']==$email)&& ($value['mobile']==$mobile)&& ($value['resume']==$resume)) { echo $query="INSERT INTO student(name,email,mobile,resume)VALUES('$name','$email','$mobile','$resume')"; $res=mysql_query($query); if($query) { echo "Success"; } else { echo "Error"; } else { echo "Duplicate Entry"; } } } } else { echo "Records Already Exixts"; } 
 INSERT INTO tbl (col1,col2) SELECT val1,val2 FROM tbl WHERE (SELECT COUNT(*) FROM tbl WHERE col1 = val1 AND col2 = val2) = 0 LIMIT 1,1