mysql - after insert ignore get primary key

vbopmzt1  于 2023-08-02  发布在  Mysql
关注(0)|答案(3)|浏览(172)

我正在使用Python在mysql insert ignore into........中运行查询
运行查询后,我想知道行的主键。我知道有疑问

SELECT LAST_INSERT_ID();

字符串
但我不确定它是否能与插入忽略一起工作
最好的方法是什么?

ppcbkaq5

ppcbkaq51#

LAST_INSERT_ID()的文档说:
如果使用INSERT IGNORE并且忽略了该行,则AUTO_INCREMENT计数器不会递增,LAST_INSERT_ID()返回0,这反映没有插入任何行。
了解了这一点,您可以将其作为一个多步骤过程:

  • 插入忽略
  • 如果LAST_INSERT_ID(),则done(插入新行)
  • 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。但是请注意,这种方法有副作用-这些对您可能重要,也可能不重要:

  • REPLACE删除并重新创建行
  • 所以DELETE触发器会被触发
  • 此外,即使行存在,主ID也将递增
  • INSERT IGNORE保留旧的行数据,REPLACE用新的行数据替换它
o8x7eapl

o8x7eapl2#

尝试使用ON DUPLICATE KEY而不是INSERT IGNORE,也许这对你有用:

INSERT INTO your_table (`id`,`val`) VALUES(1,'Foo') ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(`id`);

SELECT LAST_INSERT_ID();

字符串
另见相关问题:MySQL ON DUPLICATE KEY - last insert id?

r6vfmomb

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));

相关问题