2011-09-21 6 views
35

ja wkładając kilka słów na stole dwie kolumny z tym poleceniem:Jak uzyskać identyfikator wielu wstawionych wierszy w MySQL?

INSERT IGNORE INTO terms (term) VALUES ('word1'), ('word2'), ('word3'); 
  1. Jak mogę uzyskać identyfikator (klucz podstawowy) rzędu, w którym jest umieszczony każde słowo. Mam na myśli zwracanie wartości takiej jak "55,56,57" po wykonaniu INSERT. Czy MySQL ma taką odpowiedź?

  2. Termin kolumna to UNIQUE. Jeśli termin już istnieje, MySQL go nie włączy. Czy można zwrócić referencję dla tego powielenia (tj. Identyfikator wiersza, w którym termin istnieje)? Odpowiedź taka jak "55, , 56".

Odpowiedz

35
  1. ją uzyskać przez SELECT LAST_INSERT_ID(); lub poprzez posiadanie ramy/biblioteki MySQL (w dowolnym języku) nazywamy mysql_insert_id().

  2. To nie zadziała. Tam musisz przesłać zapytanie o identyfikatory po włożeniu.

+5

1. To nie zadziała w przypadku wielowierszowej wstawki, takiej jak OP. – ceejayoz

+0

+1 dla poprawnej odpowiedzi. : D – brenjt

+2

W prawo - nie w jednym z 'WSTAWIJ IGNORE". Ale w przypadku, który nie jest "IGNORE ", daje pierwszą wygenerowaną i wstawioną wartość. – glglgl

3

Dlaczego nie po prostu:

SELECT ID 
    FROM terms 
WHERE term IN ('word1', 'word2', 'word3') 
+0

To spowoduje pobranie terminów, które zostały wcześniej wstawione, i będzie podatne na warunki wyścigu, w których coś innego wstawia rekordy przed uruchomieniem zapytania wyboru. – ceejayoz

+2

?? termin ma warunek UNIKALNY. Jedyną rzeczą, która może wpłynąć na SELECT w warunkach wyścigu jest DELETE, a nie INSERT. I zgodnie z (2) postem PO, chcą one, aby włączone były wcześniej wstawione identyfikatory rekordów. – mellamokb

+0

To właśnie miałem na myśli; ale potrzebuje kilku linii kodowania. Oprócz SELECT, potrzebuję pobrać wyniki i uzyskać je w pętli while (w PHP, którego używam). Mam nadzieję znaleźć jakąś odpowiedź mysql. – Googlebot

1

Po pierwsze, aby uzyskać identyfikator właśnie zainstalowana, można zrobić coś takiego:

SELECT LAST_INSERT_ID() ; 

Care, to będzie działać tylko po ostatnim INSERT zapytania i powróci tylko pierwszy identyfikator jeśli masz wiele wkładek!

Następnie, z opcją IGNORE, nie sądzę, że możliwe jest uzyskanie linii, które nie zostały wstawione. Kiedy tworzysz INSERT IGNORE, po prostu mów MySQL, aby zignorował linie, które musiałyby utworzyć duplikat.

Jeśli nie dodasz tej opcji, INSERT zostanie zatrzymany, a linia będzie objęta duplikacją.

+0

Nawet bez IGNORE działa tylko dla INSERT z jednym rzędem. Moja komenda jest wielorzędowa INSERT – Googlebot

+0

Jedyną pierwszą częścią mojej odpowiedzi było włączenie IGNORE. –

+1

Jeśli używasz PHP, możesz przechowywać identyfikatory w tabeli za pomocą pętli z pojedynczym INSERT w każdym fragmencie. –

Powiązane problemy