在进行MySQL INSERT时,如果插入因重复键而失败,是否有办法返回该密钥的ID?

时间:2011-03-19 22:08:53

标签: mysql insert duplicates

所以我有一张这样的表:

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

我的插入是

  1. 插入testtext)个值('a');
  2. 插入testtext)个值('b');
  3. 插入testtext)个值('a');
  4. 第三个插入将失败,但我希望它返回testId以获取副本(对于'a')。

    如果不编写第二个查询,这可能吗?

2 个答案:

答案 0 :(得分:1)

您无法在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;

答案 1 :(得分:0)

有两种方法可以做到这一点。如果您只想替换现有数据,可以使用

REPLACE INTO <table_name> VALUES <values>

这是最简单的事情。但是,如果您只想检查数据是否存在,您可以先执行此操作

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

如果存在,查询返回的次数超过0.

希望这有帮助。