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
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.
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
Możesz użyć wyzwalaczy .
Sprawdź również Ten przewodnik wprowadzający do wyzwalaczy .
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.
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.
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.
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";
}
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
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