问题摘要:对于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 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
{{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);
是的,我知道,它会让您的代码更长久。你将不幸地忍受这一点。