Duplikowanie i ignorowanie na wstawkach MySQL
Klucze podstawowe tabeli MySQL i unikalne indeksy zapobiegają dodawaniu do tabeli wielu wierszy z tym samym indeksem. Jeśli spróbujesz wstawić zduplikowany wiersz ze standardową instrukcją INSERT, napotkasz błąd i wstawienie się nie powiedzie.
MySQL zapewnia kilka alternatyw dla standardowej instrukcji INSERT, a każda z nich obsługuje nieco inne wiersze: "INSERT IGNORE", "INSERT ... ON DUPLICATE KEY UPDATE" i "REPLACE."
Klucze podstawowe i unikalne indeksy
Podstawowe indeksy kluczy i ograniczenia indeksu "UNIQUE" wymagają, aby każdy wiersz zawierał unikalną wartość w kolumnach indeksu, umożliwiając identyfikację każdego wiersza za pomocą klucza podstawowego lub wartości w kolumnie (kolumnach) indeksu UNIQUE.
Jeśli normalny INSERT spróbuje wstawić wiersz zawierający zduplikowaną wartość w kluczu podstawowym lub indeksu ograniczenia UNIQUE, wstawienie nie powiedzie się, prawdopodobnie wycofując całą transakcję.
INSERT IGNORE
INSERT IGNORE wstawi wiersze w taki sam sposób, jak INSERT, ale z tym wyjątkiem, że zignoruje wiersze ze zduplikowanymi wartościami i będzie kontynuował wykonywanie bez tworzenia błędu. Każdy wiersz zawierający zduplikowaną wartość nie zostanie wstawiony; na przykład:
WSTAW IGNORE IN my_table (unique_index_column, other_column) VALUES (1, "inna wartość");
INSERT ... ON DUPLICATE KEY UPDATE
INSERT ... ON DUPLICATE KEY UPDATE spowoduje wstawienie dowolnych wierszy, które nie są duplikatami. Jednakże, gdy napotka duplikat wiersza, wykona aktualizację w oryginalnym wierszu; na przykład:
INSERT INTO my_table (unique_index_column, other_column) VALUES (1, "inna wartość") ON DUPLICATE KEY UPDATE inna_kolumn = "duplikowana wartość aktualizacji";
ZASTĄPIĆ
REPLACE działa tak samo jak INSERT, z tym że po napotkaniu zduplikowanego wiersza usuwa oryginalny wiersz, a następnie kontynuuje wstawianie. Każdy wiersz z duplikatem unikalnej wartości indeksu zastąpi wiersz, który pierwotnie zawierał wartość; na przykład:
REPLACE INTO my_table (unikalny_indeks_kolumn, inny_kolumn) WARTOŚCI (1, "inna wartość")