2010-06-14 13 views
7

Oto mój stół z kilkoma przykładowymi danymiMySQL INSERT Nie ignoruj ​​pracy

a_id | b_id 
------------ 
    1 225 
    2 494 
    3 589 

Kiedy uruchomić tego zapytania

INSERT IGNORE INTO table_name (a_id, b_id) VALUES ('4', '230') ('2', '494') 

wstawia to zarówno te wiersze, kiedy to powinno się ignorować parę druga wartość (2, 494)

Nie zdefiniowano indeksów, żadna z tych kolumn nie jest podstawowa.

Czego nie wiem?

Odpowiedz

13

Z docs:

Jeśli używasz słowa kluczowego Ignoruj ​​błędy występujące podczas wykonywania instrukcji INSERT są traktowane jako ostrzeżenia zamiast. Na przykład, bez IGNORE, wiersz, który duplikuje istniejący indeks UNIQUE lub PRIMARY KEY o wartości w tabeli powoduje błąd duplikatu klucza i instrukcja jest przerywana. Za pomocą IGNORE wiersz nadal nie jest wstawiany, ale nie wydano błędu.

(Moja kursywa).

Twój wiersz nie powtarza "istniejącego indeksu UNIQUE lub wartości klucza podstawowego", ponieważ nie masz klucza podstawowego ani żadnych ograniczeń unikalnych.


Jeżeli, jak wspomina w jednym ze swoich komentarzy, chcesz ani pola, aby być unikatowa ale zrobić chcą kombinacja być unikalne, trzeba kompozytowy klucz podstawowy poprzek obu kolumnach (pozbyć pierwsze jakieś duplikaty):

alter table MYTABLE add primary key (a_id,b_id) 
1

jeśli nie ma klucza głównego, nie można skopiować klucza, aby go zignorować. zawsze powinieneś ustawić klucz podstawowy, więc błagaj o to - a jeśli chcesz mieć dodatkowe kolumny, które nie powinny być duplikowane, ustaw je jako "unikalne".

+0

Hmm ... więc jak zignorować duplikat wiersza bez potrzeby użycia klucza podstawowego? I nie chcę ustawić konkretnej kolumny jako unikalnej. Chcę, aby połączenie obu kolumn było unikalne. Na przykład może istnieć wiersz (3, 589) i wiersz (3, 330), ale nie może być dwóch (3, 589) s – HyderA

+0

Należy użyć ograniczenia unikalnego dla wielu kolumn. Przykład dostarczony już przez Paxdiablo. Spełni to twoje wymagania.MUSISZ mieć unikalne ograniczenie, jeśli chcesz, aby MySQL obsługiwał twoje żądanie IGNORE. – Fenton

3

Jeśli nie podasz kryteriów UNIQUE lub nie ustawisz PRIMARY KEY, MySql nie będzie wiedział, że twój nowy wpis jest duplikatem.

0

Jeśli rozumiem zostanie poprawnie, po uruchomieniu polecenia insert tabela wygląda tak

1 225 
2 494 
3 589 
4 230 
2 494 

Jeśli tak, to odpowiedź brzmi, ponieważ projekt tabeli umożliwia duplikaty.

Jeśli chcesz zapobiec wstawianiu drugiego rekordu, musisz zdefiniować kolumnę a_id jako klucz podstawowy lub unikalny indeks. Jeśli to zrobisz, instrukcja ignore insert będzie działać tak, jak tego oczekujesz, tzn. Wstawi rekordy, zignoruje błędy, takie jak próba dodania duplikatu rekordu.