Mysql 有没有办法防止“插入或忽略”失败时自动增加?

Mysql 有没有办法防止“插入或忽略”失败时自动增加?,mysql,sql,sqlite,auto-increment,Mysql,Sql,Sqlite,Auto Increment,问题摘要:对于MySQL和SQLite,在具有AUTOINCREMENT的表上插入或忽略失败仍然会增加autoincremented值。这里讨论了这一点: 我的问题是:插入失败率高达99%的表最终会产生巨大的索引号,例如记录1500的索引为165200 这是不切实际的,所以我正在寻找一种方法来对付这种行为 由于INSERT或IGNORE被认为与INSERT ON CONFLICT IGNORE相同,因此我考虑使用INSERT ON CONFLICT FAIL或INSERT ON CONFLICT

问题摘要:对于MySQL和SQLite,在具有AUTOINCREMENT的表上插入或忽略失败仍然会增加autoincremented值。这里讨论了这一点:

我的问题是:插入失败率高达99%的表最终会产生巨大的索引号,例如记录1500的索引为165200

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

由于INSERT或IGNORE被认为与INSERT ON CONFLICT IGNORE相同,因此我考虑使用INSERT ON CONFLICT FAIL或INSERT ON CONFLICT ABORT

我的问题是,我以这种方式从选择中插入:

在t1中插入或忽略x、y、z,从t2中选择*

此语法不接受冲突失败。这两种方法都不起作用:

在t1 x、y、z中插入冲突失败,从t2中选择*

在t1中插入x、y、z,在冲突失败时从t2中选择*

有什么想法或暗示吗

首先,on conflict仅适用于sqlite,在定义约束时使用,例如。。。冲突中止的主键。。。。如果其中一行失败,abort将不会插入任何行。失败更奇怪:如果您尝试插入5行,而第3行由于键而失败,它将插入前2行,然后停止。总之,不要使用它。这两个版本至少在多行中与“忽略”不同

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

通常的方法是检查该行是否为您自己存在,而不是检查lazy on replicate key/ignore。例如,要检查y列中的重复值:

是的,我知道,这会让你的代码更长。不幸的是,您不得不接受这一点。

首先,on conflict仅适用于sqlite,并且在定义约束时使用,例如。。。冲突中止的主键。。。。如果其中一行失败,abort将不会插入任何行。失败更奇怪:如果您尝试插入5行,而第3行由于键而失败,它将插入前2行,然后停止。总之,不要使用它。这两个版本至少在多行中与“忽略”不同

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

通常的方法是检查该行是否为您自己存在,而不是检查lazy on replicate 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);