MySQL - игнорировать ошибку вставки: дублировать запись
Я работаю в PHP.
Пожалуйста, какой способ вставить новые записи в БД, который имеет уникальное поле.
Я вставляю много записей в пакетном режиме, и я просто хочу, чтобы новые были вставлены, и я не хочу никакой ошибки для повторяющейся записи.
Есть ли только способ сделать SELECT и посмотреть, есть ли запись там до INSERT - и INSERT, только если SELECT не возвращает записи? Надеюсь, что нет.
Я хотел бы как-то сказать MySQL игнорировать эти вставки без каких-либо ошибок.
Спасибо
Ответы
Ответ 1
Вы можете использовать INSERT... IGNORE синтаксис, если вы не хотите предпринимать никаких действий при наличии дублированной записи.
Вы можете использовать REPLACE INTO, если вы хотите перезаписать старую запись новым с тем же ключом.
Или вы можете использовать синтаксис INSERT... ON DUPLICATE KEY UPDATE, если вы хотите выполнить обновление записи вместо этого, когда вы сталкиваетесь дубликат.
Изменить: подумал, что я бы добавил несколько примеров.
Примеры
Скажите, что у вас есть таблица с именем 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 и value = 50. Наконец:
INSERT INTO tbl VALUES (1,200) ON DUPLICATE KEY UPDATE value=200;
Теперь у вас есть одна запись с id = 1 и значением = 200.
Ответ 2
Как выглядит схема базы данных?
Вы можете добавить столбец идентификатора, который будет автоматически увеличивать для каждой вставки, чтобы гарантировать уникальные строки.
Ответ 3
Вы можете убедиться, что не вставляете дублирующую информацию, используя условие 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);
Использование двойной таблицы позволяет вводить ваши значения в операторе выбора, даже если эти значения в настоящий момент не хранятся в таблице.
из http://www.techonthenet.com/sql/insert.php
Ответ 4
Вы можете использовать triggers.
Также проверьте это руководство по внедрению триггеров.
Ответ 5
Попробуйте создать дублируемую таблицу, предпочтительно временную таблицу, без уникального ограничения, и выполните массовую загрузку в эту таблицу. Затем выберите только уникальные (DISTINCT) элементы из временной таблицы и вставьте в целевую таблицу.
Ответ 6
$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";
}
Ответ 7
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