Если при выполнении вставки MySQL вставка завершается неудачно из-за дублирования ключа, есть ли способ вернуть идентификатор этого ключа? - PullRequest
0 голосов
/ 20 марта 2011

Итак, у меня есть такая таблица:

create table `test` ( 
`testId` int(11) not null auto_increment, 
`text` varchar(10) not null default '',
primary key(`testId`),
unique(`text`)
) engine=innodb;

Моя вставка будет

  1. вставить в test (text) значения ('a');
  2. вставить в test (text) значения ('b');
  3. вставить в test (text) значения ('a');

3-я вставка завершится неудачно, но я хочу, чтобы она возвращала testId для дубликата (для 'a').

Возможно ли это без написания второго запроса?

Ответы [ 2 ]

1 голос
/ 20 марта 2011

Вы не можете сделать это в запросе INSERT, потому что INSERT не возвращает никаких строк.

В случае сбоя INSERT из-за дублированного ключа - обычно тот, кто создал запрос, знает, какие данные он отправил, поэтому он может использовать это.

Возможно, вы сможете добиться того, чего хотитеиспользуя 12.2.5.3.INSERT ... ON DUPLICATE KEY UPDATE

Если таблица содержит столбец AUTO_INCREMENT и INSERT ... UPDATE вставляет строку, функция LAST_INSERT_ID () возвращает значение AUTO_INCREMENT.Если инструкция обновляет строку, LAST_INSERT_ID () не имеет смысла.Однако вы можете обойти это, используя LAST_INSERT_ID (expr).Предположим, что id является столбцом AUTO_INCREMENT.Чтобы LAST_INSERT_ID () имел смысл для обновлений, вставьте строки следующим образом:

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3;
0 голосов
/ 20 марта 2011

Есть два способа сделать это.Если вы просто хотите заменить существующие данные, вы можете использовать

REPLACE INTO <table_name> VALUES <values>

Это самая простая вещь.Но если вы просто хотите проверить, существуют ли данные, вы можете сначала сделать это:

SELECT COUNT(*) FROM <table> WHERE <field>='<field_value>

Если существует, запрос возвращает больше 0.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...