问题摘要:对于 MySQL 和 SQLite,在使用 AUTOINCRMENT 的表上失败的 INSERT OR IGNORE
仍然会增加自动增量值。这已经在这里讨论过:INSERT IGNORE increases auto increment counter even no record is added?
我的问题:插入失败 99% 的表最终会产生巨大的索引号,例如记录 1500 的索引为 165200。
这是不切实际的,所以我正在寻找一种方法来应对这种行为。
由于 INSERT OR IGNORE
据称与 INSERT ON CONFLICT IGNORE
相同,因此我考虑使用 INSERT ON CONFLICT FAIL
或 插入冲突中止
。
我的问题是我以这种方式从 SELECT
插入:
插入或忽略到 t1 (x,y,z,) 从 t2 中选择 *
此语法不接受ON CONFLICT FAIL
。 这两者都不起作用:
将冲突失败插入 t1 (x,y,z,) SELECT * FROM t2
INSERT INTO t1 (x,y,z,) SELECT * FROM t2 ON CONFLICT FAIL
有什么想法或提示吗?
最佳答案
首先,冲突
仅适用于sqlite,在定义约束时使用(例如...主键冲突中止...
) 。如果其中一行失败,abort
将不会插入任何行。 fail
更奇怪:如果您尝试插入 5 行,而第 3 行由于键而失败,它将插入前 2 行,然后停止。简而言之:不要使用它。这两个版本都与ignore
不同(至少对于多于一行)。
插入多行时基本上只有一种方法可以防止自动增量:不要插入表中已有的行。
通常的方法是检查该行是否存在,而不是“惰性”重复键
/忽略
。例如。检查y
列中的重复值:
INSERT INTO t1 (x,y,z)
SELECT * FROM t2 main
where not exists (
select * from t1 test
where main.y = test.y);
是的,我知道,这会让你的代码变得更长。不幸的是,你将不得不忍受这一点。
关于mysql - 有什么方法可以防止失败的 'INSERT OR IGNORE' 上的 AUTOINCREASE 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37137157/