这是一张表
CREATE TABLE `mytable` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`val` char(128) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
UNIQUE KEY (val)
) ENGINE=InnoDB DEFAULT CHARSET=ascii;
任何想法为什么会发生这种情况,我希望它在第一个查询本身中将id设置为零
MariaDB > insert into mytable set id=0, val="" on duplicate key update id=0, val=val;
Query OK, 1 row affected (0.01 sec)
MariaDB > select * from mytable;
+----+-------+
| id | val |
+----+-------+
| 1 | |
+----+-------+
1 row in set (0.00 sec)
MariaDB > insert into mytable set id=0, val="" on duplicate key update id=0, val=val;
Query OK, 2 rows affected (0.01 sec)
MariaDB > select * from mytable;
+----+-------+
| id | val |
+----+-------+
| 0 | |
+----+-------+
1 row in set (0.00 sec)
MariaDB > insert into mytable set id=0, val="" on duplicate key update id=0, val=val;
Query OK, 0 rows affected (0.01 sec)
任何解释将不胜感激。
更新:我知道使用AUTO_INCREMENT = 0但这里真正的问题是查询显式设置id = 0,所以为什么它在第一个查询中将其设置为1。似乎mysql可以在重复实例中将其设置为0。
由于
答案 0 :(得分:1)
插入新记录时,将AUTO_INCREMENT
列设置为0表示“为此列生成新值”(ref)。 AUTO_INCREMENT
列的值从1开始。因此:
insert into mytable set id=0, val="" on duplicate key update id=0, val=val;
相当于:
insert into mytable set id=1, val="";
您调用的第二个插入内容会创建一个重复键(对于val
字段,不是 id
字段。这会导致运行update
语句,从而将id
更新为零。出现“2行受影响”消息,因为on duplicate key update
语句在更新现有行(ref)时返回2。
第三个insert
什么也没做。这两个键都是重复的,但现有的行不需要更新,因为它的值已经是您期望的值。在这种情况下,on duplicate key update
语句返回“0行受影响”。
答案 1 :(得分:0)
默认情况下,AUTO_INCREMENT的起始值为1,每个新记录的起始值将增加1。 要让AUTO_INCREMENT序列以另一个值开头,请使用以下SQL语句:
ALTER TABLE myTabel AUTO_INCREMENT=0;
答案 2 :(得分:0)
请勾选 NO_AUTO_VALUE_ON_ZERO
选项。
默认情况下,auto_increment
列不能插入零值。
如果您将 NO_AUTO_VALUE_ON_ZERO 设置为 on,则可以强制输入 auto_increment
列零值。
答案 3 :(得分:0)
关于 NO_AUTO_VALUE_ON_ZERO 的答案是正确的,虽然有点不完整。 sql_mode 有一个选项,允许在自动增量字段中输入明确的零值。默认情况下,0 被视为与 null 相同。如果添加 NO_AUTO_VALUE_ON_ZERO 选项,则允许在该字段中指定零值。我的 cnf 文件中有这个: sql_mode='NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
答案 4 :(得分:0)
此查询显示该类型的消息。我的乳香是什么。
3 63 01:31:26 ALTER TABLE test_data
AUTO_INCREMENT = 1 0 行受影响
记录:0 重复:0 警告:0 0.235 秒