MySQL-ignore insert error: duplicate entry

Pracuję w PHP.

Proszę, jaki jest właściwy sposób wstawiania nowych rekordów do DB, który ma unikalne pole. Wstawiam wiele rekordów w partii i chcę tylko, aby nowe zostały wstawione i nie chcę żadnego błędu dla zduplikowanego wpisu.

Czy jest tylko sposób, aby najpierw dokonać SELECT i sprawdzić, czy wpis jest już tam przed wstawką - i wstawić tylko wtedy, gdy SELECT nie zwraca żadnych rekordów? Mam nadzieję, że nie.

Chciałbym jakoś powiedzieć MySQL zignoruj te wstawki bez żadnego błędu.

Thank you

Author: bakkal, 2009-05-01

7 answers

Możesz użyć INSERT... Ignoruj składnię , jeśli nie chcesz podejmować żadnych działań, gdy istnieje zduplikowany rekord.

Możesz użyć składni zamień na składnię jeśli chcesz zastąpić stary rekord nowym rekordem z tym samym kluczem.

Lub możesz użyć INSERT... W przypadku duplicate KEY UPDATE składni, jeśli chcesz przeprowadzić aktualizację rekordu, zamiast tego, gdy napotkasz duplikat.

Edit: pomyślałem, że dodam kilka przykładów.

Przykłady

Say you mieć tabelę o nazwie tbl z dwiema kolumnami, id i value. Jest jeden wpis, id = 1 I value=1. Jeśli uruchomisz następujące polecenia:

REPLACE INTO tbl VALUES(1,50);

Masz jeszcze jeden rekord, o id = 1 wartość = 50. Należy jednak pamiętać, że cały rekord został najpierw usunięty, a następnie ponownie wstawiony. Wtedy:

INSERT IGNORE INTO tbl VALUES (1,10);

Operacja jest wykonywana pomyślnie, ale nic nie jest wstawiane. Nadal masz id = 1 i wartość = 50. Wreszcie:

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

Masz teraz pojedynczy rekord o id=1 i wartości = 200.

 142
Author: zombat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-01 18:09:17
 -1
Author: Kirtan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-01 17:50:18

Spróbuj utworzyć zduplikowaną tabelę, najlepiej tabelę tymczasową, bez unikalnego ograniczenia i załaduj ją zbiorczo. Następnie wybierz tylko unikalne (odrębne) elementy z tabeli tymczasowej i wstaw do tabeli docelowej.

 -1
Author: Jordan S. Jones,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-01 17:51:01

Jak wygląda schemat bazy danych?

Możesz dodać kolumnę ID, która będzie auto increment dla każdej wstawki, aby zagwarantować unikalne wiersze.

 -1
Author: Ben S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-01 17:51:17

Pytanie: konfiguruję bazę danych z klientami. Wiem, że używasz polecenia "insert" do wstawiania informacji w bazie danych, ale jak mam się upewnić, że nie wprowadzę ponownie tych samych informacji o kliencie?

Odpowiedź: możesz upewnić się, że nie wstawiasz zduplikowanych informacji, używając warunku EXISTS.

Na przykład, jeśli masz tabelę o nazwie clients z kluczem głównym client_id, możesz użyć następującej instrukcji:

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);

To stwierdzenie wstawia wiele rekordów z zaznaczeniem podrzędnym.

Jeśli chcesz wstawić pojedynczy rekord, możesz użyć następującej instrukcji:

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);

Użycie podwójnej tabeli umożliwia wprowadzanie wartości w instrukcji select, nawet jeśli wartości nie są obecnie przechowywane w tabeli.

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

 -1
Author: gehsekky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-01 17:52:10
$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";
}
 -2
Author: chandrasekar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-25 06:37:27
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
 -6
Author: Edison,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-04 11:21:26