MySQL - помилка ігнорування вставки: повторюваний запис


75

Я працюю в PHP.

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

Чи є єдиний спосіб спочатку зробити SELECT та перевірити, чи запис уже є перед INSERT - і ВСТАВИТИ лише тоді, коли SELECT не повертає записів? Я сподіваюся, що не.

Я хотів би якось сказати MySQL ігнорувати ці вставки без помилок.

Дякую


вставка ігнорування працює для мене Проблема в тому, що деякі рядки видаляються з таблиці, і я намагаюся вставити ті самі ідентифікатори рядків, які раніше були видалені, і в цьому випадку спрацювало твердження "вставити ігнорувати"
Баладжі,

Відповіді:


163

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

Ви можете використовувати ЗАМІНИТИ НА Синтаксис, якщо ви хочете замінити старий запис на новий із тим самим ключем.

Або ви можете використовувати синтаксис 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 і значення = 50. Нарешті:

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

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


9
"Якщо ви використовуєте ключове слово IGNORE, помилки, які виникають під час виконання оператора INSERT, замість цього трактуються як попередження." -з вищевказаного
вставного

2
Однак попередження не викликають помилок, тому ваш скрипт буде продовжувати виконуватися. З посібника: Якщо ви використовуєте ключове слово IGNORE, помилки, що виникають під час виконання оператора INSERT, замість цього трактуються як попередження. Наприклад, без IGNORE рядок, який дублює існуючий UNIQUE індекс або значення PRIMARY KEY у таблиці, спричиняє помилку ключа-дубліката, а оператор переривається. З IGNORE рядок все ще не вставляється, але помилка не видається.
зомбат

IGNOREбуде ігнорувати помилки, які можуть не мати нічого спільного з дублікатами ключів. Краще це зробити, ON DUPLICATE KEY UPDATE field=fieldщоб ви могли ловити ці помилки і як бонус, не мати жодних попереджень.
Чіното Вокро

-1

Ви можете переконатися, що не вставляєте повторювану інформацію, використовуючи умову ІСНУЄ.

Наприклад, якщо у вас була таблиця з іменами клієнтів з первинним ключем 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


Це не належний спосіб зробити це. Це рішення повільне, складніше в обслуговуванні та схильне до помилок. Використання INSERT з IGNORE було б набагато кращим рішенням.
womp

Це видається декартовим приєднанням, що не рекомендується за цих обставин.
Blue Water


-3

Спробуйте створити повторювану таблицю, бажано тимчасову, без унікальних обмежень, і виконайте масове завантаження цієї таблиці. Потім виберіть лише унікальні (DISTINCT) елементи з тимчасової таблиці та вставте їх у цільову таблицю.


-3
$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";
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.