MySQL - игнорировать ошибку вставки: повторяющаяся запись - PullRequest
71 голосов
/ 01 мая 2009

Я работаю в PHP.

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

Есть ли единственный способ сначала сделать SELECT и посмотреть, существует ли запись до INSERT - и INSERT, только когда SELECT не возвращает записей? Я надеюсь, что нет.

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

Спасибо

Ответы [ 6 ]

154 голосов
/ 01 мая 2009

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

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

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

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

Примеры

Допустим, у вас есть таблица с именем tbl с двумя столбцами, id и value. Есть одна запись, id = 1 и значение = 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.

0 голосов
/ 25 ноября 2015
$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";
}
0 голосов
/ 01 мая 2009

Вопрос: я настраиваю базу данных с клиентами. Я знаю, что вы используете оператор "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);

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

из http://www.techonthenet.com/sql/insert.php

0 голосов
/ 01 мая 2009

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

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

0 голосов
/ 01 мая 2009

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

0 голосов
/ 01 мая 2009

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

Также проверьте это руководство по запуску .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...