else SELECT your_primary key FROM yourtable WHERE(插入数据的UNIQUE约束)
以美国为例声明:
id | abbrev | other_data
1 | AL | ...
2 | AK |
UNIQUE KEY abbr (abbrev)
字符串 现在,插入一个新行:
INSERT IGNORE INTO `states` (`abbrev`,`other_data`) VALUES ('AZ','foo bar');
> OK
SELECT LAST_INSERT_ID();
> "3"
// we have the ID, we're done
型 插入将被忽略的行:
INSERT IGNORE INTO `states` (`abbrev`,`other_data`) VALUES ('AK','duplicate!');
> OK
SELECT LAST_INSERT_ID();
> "0"
// oops, it already exists!
SELECT id FROM `states` WHERE `abbrev` = 'AK'; // our UNIQUE constraint here
> "2"
// there we go!
型 另外,也有一个可行的解决方法,即使用REPLACE INTO代替INSERT IGNORE INTO-the syntax is very similar。但是请注意,这种方法有副作用-这些对您可能重要,也可能不重要:
3条答案
按热度按时间ppcbkaq51#
LAST_INSERT_ID()
的文档说:如果使用INSERT IGNORE并且忽略了该行,则AUTO_INCREMENT计数器不会递增,LAST_INSERT_ID()返回0,这反映没有插入任何行。
了解了这一点,您可以将其作为一个多步骤过程:
以美国为例声明:
字符串
现在,插入一个新行:
型
插入将被忽略的行:
型
另外,也有一个可行的解决方法,即使用
REPLACE INTO
代替INSERT IGNORE INTO
-the syntax is very similar。但是请注意,这种方法有副作用-这些对您可能重要,也可能不重要:INSERT IGNORE
保留旧的行数据,REPLACE
用新的行数据替换它o8x7eapl2#
尝试使用ON DUPLICATE KEY而不是INSERT IGNORE,也许这对你有用:
字符串
另见相关问题:MySQL ON DUPLICATE KEY - last insert id?
r6vfmomb3#
我不认为首选的答案是正确的,至少在我尝试的mysql版本(5.7.12和8.0.33)和InnoDB表中不是这样。只有@fatal_error声明了真实的行为。LAST_INSERT_ID()返回最后一次成功插入的id,不管是否有任何INSERT IGNORE没有在同一个数据库连接中创建实际记录(包含在TRANSACTION中不会改变行为)。这似乎与文档一致。此外,即使INSERT IGNORE没有创建记录,id也会增加,因此在下一次成功的INSERT中,id将增加1以上。我用两种可能的INSERT失败测试了这种行为:
1.未满足的外键约束
1.未满足的唯一约束获得相同的结果。
另外,术语INSERT IGNORE不会失败,它不会插入任何行。它根本没有效果。最后,一个解决方案:调用LAST_INSERT_ID()获取id后,重置为0,SET @placeholder:=(SELECT LAST_INSERT_ID(0));