有什么方法可以防止'INSERT或IGNORE'失败时出现AUTOINCREASE?

时间:2016-05-10 11:26:14

标签: mysql sql sqlite auto-increment

问题摘要:对于MySQL和SQLite,具有AUTOINCREMENT的表上的失败INSERT OR IGNORE仍然会增加自动增量值。这已在此处讨论过:INSERT IGNORE increases auto increment counter even no record is added?

我的问题:包含99%失败插入的表最终会有大量索引号,例如记录1500的索引为165200.

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

由于INSERT ON CONFLICT IGNORE应与INSERT ON CONFLICT FAIL相同,因此我考虑使用INSERT ON CONFLICT ABORTSELECT

我的问题是我以这种方式从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

{{1}}

有任何想法或提示吗?

1 个答案:

答案 0 :(得分:2)

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

当您插入多行时,基本上只有一种方法可以防止自动增量:不要插入表中已有的行。

通常的方法是检查行是否存在而不是" 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);

是的,我知道,它会让您的代码更长久。你将不幸地忍受这一点。