一尘不染

mysql-插入后忽略获取主键

mysql

我正在insert ignore into........使用Python 在mysql中运行查询

运行查询后,我想知道该行的主键。我知道有查询

SELECT LAST_INSERT_ID();

但是我不确定它是否可以与插入忽略一起使用

做这个的最好方式是什么?


阅读 218

收藏
2020-05-17

共1个答案

一尘不染

文档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');
> 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-
语法非常相似。但是请注意,这种方法会
产生副作用 -这些 副作用 可能对您不重要:

  • REPLACE删除并重新创建行
    • 所以DELETE触发器被触发了
    • 此外,即使该行存在,主ID也将递增
    • INSERT IGNORE保留旧的行数据,REPLACE将其替换为新的行数据
2020-05-17