有什么方法可以防止失败 'INSERT OR IGNORE' 时自动增加?

Any way to prevent AUTOINCREASE on failed 'INSERT OR IGNORE'?

问题总结:使用 MySQL 和 SQLite,在 table 上使用 AUTOINCREMENT 失败的 INSERT OR IGNORE 仍然 增加自动增量值 .这已经在这里讨论过:INSERT IGNORE increases auto increment counter even no record is added?

我的问题:插入失败率为 99% 的 table 以巨大的索引号结束,例如记录 1500 的索引为 165200。

这是不切实际的,所以我正在寻找一种方法来应对这种行为。

既然INSERT OR IGNORE应该和INSERT ON CONFLICT IGNORE一样,我就想到了用INSERT ON CONFLICT FAILINSERT ON CONFLICT ABORT

我的问题是我是这样从 SELECT 插入的:

INSERT OR IGNORE INTO t1 (x,y,z,) SELECT * FROM t2

此语法不接受 ON CONFLICT FAIL这两个都不起作用:

INSERT ON CONFLICT FAIL INTO t1 (x,y,z,) SELECT * FROM t2

INSERT INTO t1 (x,y,z,) SELECT * FROM t2 ON CONFLICT FAIL

有什么想法或提示吗?

首先,on conflict仅适用于sqlite,在定义约束时使用(例如... primary key on conflict abort ...)。如果其中一行失败,abort 将不会插入任何行。 fail 更奇怪:如果您尝试插入 5 行并且第 3 行因为键而失败,它将插入前 2 行然后停止。简而言之:不要使用它。两个版本都与 ignore 不同(至少不止一行)。

基本上只有一种方法可以在插入多行时防止自动递增:不要插入已经在 table 中的行。

通常的做法是自己检查该行是否存在,而不是 "lazy" on duplicate key/ignore。例如。检查列中的重复值 y:

INSERT INTO t1 (x,y,z) 
SELECT * FROM t2 main
where not exists (
    select * from t1 test
    where main.y = test.y);

是的,我知道,这会使您的代码更长。不幸的是,你将不得不忍受这一点。