2011-09-21 3 views
35

Я вставив несколько слов в таблицу из двух столбцов с этой командой:Как получить идентификатор нескольких вставленных строк в MySQL?

INSERT IGNORE INTO terms (term) VALUES ('word1'), ('word2'), ('word3'); 
  1. Как я могу получить идентификатор (первичный ключ) строки, в который вставляется каждое слово. Я имею в виду возвращение значения типа «55,56,57» после выполнения INSERT. Есть ли у MySQL такой ответ?

  2. Термин столбец UNIQUE. Если термин уже существует, MySQL не будет его вставлять. Можно ли вернуть ссылку для этого дублирования (т. Е. Идентификатор строки, в которой существует этот термин)? Ответ типа «55, , 56».

ответ

35
  1. Вы получаете его через SELECT LAST_INSERT_ID(); или через с вашей рамки/библиотеки MySQL (на любом языке) называют mysql_insert_id().

  2. Это не сработает. Там вам нужно запросить идентификаторы после вставки.

+5

1. Это не будет работать для многострочной вставки, такой как OP. – ceejayoz

+0

+1 для правильного ответа. : D – brenjt

+2

Право - не в одном с 'INSERT IGNORE'. Но в не-'IGNORE', он дает вам первое значение, сгенерированное и вставленное. – glglgl

3

Почему не просто:

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

Это позволит получить термины, которые были вставлены ранее, и это будет уязвимым для условий гонки, когда что-то еще вставляет записи перед тем, как вызывается запрос выбора. – ceejayoz

+2

?? термин имеет УНИКАЛЬНОЕ условие. Единственное, что может повлиять на SELECT в состоянии гонки, это DELETE, а не другой INSERT. И согласно (2) в сообщении OP, они хотят включить идентификаторы ранее вставленных записей. – mellamokb

+0

Вот что я имел в виду; но ему нужно несколько строк кодирования. Помимо SELECT, мне нужно получить результаты и получить их в цикле while (в php, который я использую). Я надеюсь найти какой-то ответ mysql. – Googlebot

1

Во-первых, чтобы получить идентификатор только что вставили, вы можете сделать что-то вроде:

SELECT LAST_INSERT_ID() ; 

Care, это будет работать только после последнего INSERT запроса и возвращает первый ID только если у вас есть множественная вставка!

Затем, с опцией IGNORE, я не думаю, что можно получить строки, которые не были вставлены. Когда вы делаете INSERT IGNORE, вы просто указываете MySQL игнорировать строки, которые должны были бы создать дублируемую запись.

Если вы не поместите эту опцию, то INSERT будет остановлен, и у вас будет линия, связанная с дублированием.

+0

Даже без IGNORE он будет работать только для однострочного INSERT. Моя команда - многострочный INSERT – Googlebot

+0

Только первая часть моего ответа включала IGNORE. –

+1

Если вы используете PHP, вы можете хранить идентификаторы в таблице, используя цикл с одним INSERT в каждом проходе. –

Смежные вопросы