文档的
LAST_INSERT_ID()说:
如果使用INSERT
IGNORE并且忽略该行,则AUTO_INCREMENT计数器不会增加,并且LAST_INSERT_ID()返回0,这表明没有插入行。
知道了这一点,您可以将其分为多个步骤:
- 插入忽略
- 如果LAST_INSERT_ID(),则完成(插入新行)
- else从yourtable WHERe中选择your_primary键(您插入的数据的UNIQUE约束)
美国各州的示例:
id | abbrev | other_data 1 | AL | ... 2 | AK |UNIQUE KEY abbr (abbrev)
现在,插入新行:
INSERT IGNORE INTO `states` (`abbrev`,`other_data`) VALUES ('AZ','foo bar');> OKSELECt LAST_INSERT_ID();> "3"// we have the ID, we're done插入将被忽略的行:
INSERT IGNORE INTO `states` (`abbrev`,`other_data`) VALUES ('AK','duplicate!');> OKSELECT 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-
语法非常相似。但是请注意,这种方法会
产生副作用 -这些 副作用 可能对您不重要:
- REPLACE删除并重新创建行
- 所以DELETE触发器被触发了
- 此外,即使该行存在,主ID也将递增
INSERT IGNORE
保留旧的行数据,REPLACE
将其替换为新的行数据



