MySQL INSERT, только если строка не существует, в противном случае выберите дублирующую строку - PullRequest
4 голосов
/ 20 июня 2010

Я ищу оператор, который попытается вставить строку в таблицу, но вернет первичный ключ дубликата строки, если он встречается.Одно поле в таблице - это первичный ключ с автоинкрементом, другое уникально.

Ответы [ 2 ]

1 голос
/ 20 июня 2010

Это должно, по крайней мере, теоретически, работать для вас:

Сначала расширьте вашу таблицу, чтобы иметь дополнительный столбец-пустышку типа tinyint.Затем вы можете использовать следующий запрос при вставке / обновлении:

INSERT INTO yourtable (a, b) VALUES (1, 2) ON DUPLICATE KEY UPDATE id  = LAST_INSERT_ID(id), dummy = NOT dummy

(здесь я предполагаю, что столбец a имеет уникальный индекс и существует строка с = 1).

Затем вы можете получить идентификатор новой строки (в случае вставки) или существующей строки (в случае обновления) через

SELECT LAST_INSERT_ID()
0 голосов
/ 20 июня 2010

Это должно работать в DB2, не знаю, будет ли это в MySQL или есть специальный синтаксис MySQL для него:

SELECT pk, 'inserted' FROM FINAL TABLE (
  INSERT INTO table (Col1)
  SELECT Val1
  FROM table
  WHERE col1 != Val1
  FETCH FIRST ROW ONLY
)
UNION 
SELECT pk, 'existing'
FROM table
WHERE col1 = val1

Идея состоит в том, чтобы выбрать одну строку из таблицы, когда ее нетуникальное значение, вставляя новое значение и возвращая сгенерированный первичный ключ из таблицы.Затем это объединяется с выбором, который возвращает соответствующий ключ, если уникальные значения уже находятся в таблице.Только один из этих операторов должен возвращать строку, второй столбец указывает, является ли первичный ключ новым или существующим.

...