Jaka jest różnica między INSERT IGNORE a INSERT…ON DUPLICATE KEY AKTUALIZACJA. Chciałbym również wiedzieć, który z nich jest lepszy od drugiego. Czy ktoś może mi pomóc?

1
Olivia 16 czerwiec 2021, 15:29

3 odpowiedzi

Najlepsza odpowiedź

Jeśli używasz INSERT..IGNORE, błędy występujące podczas wykonywania instrukcji INSERT są traktowane jako ostrzeżenia. Jedną rzeczą, która nie jest wyraźnie wymieniona, jest to, że INSERT..IGNORE spowoduje, że nieprawidłowe wartości zostaną dostosowane do najbliższych wartości po wstawieniu (podczas gdy nieprawidłowe wartości mogą spowodować przerwanie zapytania, jeśli słowo kluczowe IGNORE nie zostanie użyte).

Coś ważnego do dodania: Kiedy używasz INSERT IGNORE i masz kluczowe naruszenia, MySQL NIE zgłasza ostrzeżenia! Jeśli spróbujesz na przykład wstawić 100 rekordów na raz, z jednym błędnym, uzyskasz tryb interaktywny:

Query OK, 99 rows affected (0.04 sec)
Records: 100  Duplicates: 1  Warnings: 0

Jak widzisz: Brak ostrzeżeń! Takie zachowanie jest nawet błędnie opisane w oficjalnej dokumentacji Mysql. Jeśli twój skrypt musi zostać poinformowany, jeśli jakieś rekordy nie zostały dodane (z powodu naruszeń kluczy), musisz wywołać mysql_info() i przeanalizować go pod kątem wartości "Duplikaty".

ON DUPLICATE KEY UPDATE nie jest tak naprawdę w standardzie. To prawie tak standardowe, jak REPLACE. Zobacz SQL_MERGE

Jeśli w tej samej instrukcji użyjesz zarówno INSERT IGNORE, jak i ON DUPLICATE KEY UPDATE, aktualizacja zostanie przeprowadzona, jeśli wstawka znajdzie zduplikowany klucz. Innymi słowy, aktualizacja ma pierwszeństwo przed ignorowaniem. Jeśli jednak sama klauzula ON DUPLICATE KEY UPDATE spowoduje błąd zduplikowanego klucza, zostanie on zignorowany.

Może się to zdarzyć, jeśli masz więcej niż jeden unikalny klucz lub jeśli aktualizacja próbuje złamać ograniczenie klucza obcego

0
Anwesha Sahu 16 czerwiec 2021, 13:04

Jeśli próbujesz uniknąć naruszenia duplikacji, różnica jest taka: INSERT IGNORE nie pozwala na określenie akcji (aby zmienić coś w wierszu), jeśli wystąpi naruszenie ograniczenia unikatowego, podczas gdy dla INSERT...ON DUPLICATE KEY UPDATE określenie akcji jest obowiązkowe . Oczywiście możesz podać fałszywą aktualizację w INSERT...ON DUPLICATE KEY UPDATE (na przykład SET id=id, gdzie id jest kluczem podstawowym/unikalnym) - w tym przypadku nie ma różnicy.

INSERT IGNORE może również zignorować inne błędy, które można zignorować, zamiast INSERT...ON DUPLICATE KEY UPDATE.

0
Akina 16 czerwiec 2021, 12:41

Jeśli użyjesz INSERT IGNORE, wiersz nie zostanie wstawiony, jeśli spowoduje to zduplikowanie klucza. Ale oświadczenie nie wygeneruje błędu. Zamiast tego generuje ostrzeżenie. Te przypadki obejmują:

• Wstawianie zduplikowanego klucza w kolumnach z ograniczeniami PRIMARY KEY lub UNIQUE.

• Wstawianie wartości NULL do kolumny z ograniczeniem NOT NULL.

• Wstawianie wiersza do tabeli partycjonowanej, ale wstawiane wartości nie są mapowane na partycję.

Jeśli używasz REPLACE, MySQL faktycznie wykonuje wewnętrznie DELETE, po którym następuje INSERT, co ma kilka nieoczekiwanych skutków ubocznych:

•Przydzielony jest nowy identyfikator automatycznego przyrostu.

• Zależne wiersze z kluczami obcymi mogą zostać usunięte (jeśli używasz kaskadowych kluczy obcych) lub uniemożliwić REPLACE.

•Wyzwalacze, które uruchamiają się przy DELETE, są wykonywane niepotrzebnie.

• Efekty uboczne są również przenoszone na urządzenia podrzędne replikacji.

Zarówno REPLACE, jak i INSERT...ON DUPLICATE KEY UPDATE są niestandardowymi, zastrzeżonymi wynalazkami specyficznymi dla MySQL. ANSI SQL 2003 definiuje instrukcję MERGE, która może rozwiązać te same potrzeby (i więcej), ale MySQL nie obsługuje instrukcji MERGE.

0
Dharman 16 czerwiec 2021, 12:39