有什么方法可以防止失败 '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 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
有什么想法或提示吗?
首先,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);
是的,我知道,这会使您的代码更长。不幸的是,你将不得不忍受这一点。
问题总结:使用 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 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
有什么想法或提示吗?
首先,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);
是的,我知道,这会使您的代码更长。不幸的是,你将不得不忍受这一点。