mysql - 有什么方法可以防止失败的 'INSERT OR IGNORE' 上的 AUTOINCREASE 吗?

标签 mysql sql sqlite auto-increment

问题摘要:对于 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/

相关文章:

ruby-on-rails - 在 Heroku 上使用 sqlite 安装 Rails 应用程序

MySQL LEFT JOIN 仅返回右表上带有 where 条件的一行

mysql - 'Query' MySQL数据文件是做什么用的?

sql - 计算两个相同表的匹配行和计算表的行数

sql - 在 Meteor 中使用经典的 node.js ORM

android - 我什么时候应该在 android 中使用内容提供程序

sql - 如果表为空,则将行插入表中,如果不在 SQLite 中,则替换现有行

mysql - 子查询比连接运行得更快?

mysql - 在 2 个 SQL 表中创建引用的更好方法是什么?

mysql - 根据另一个表的 id 对一个基于结果的组中两个不同表的两列求和