MySQL无法使列auto_increment
-
28-10-2019 - |
题
我有一个表“ Bestelling”,其中包含4列:“ Id”(PK),“ KlantId”,“ Datum”,“ BestellingsTypeId”,现在我想使列ID为auto_increment,但是当我尝试这样做时那,我得到这个错误: 通用标签
有人知道吗?
解决方案
如果表包含ID为0(或负数)的现有记录,则会发生这种情况。更新所有现有记录以使用正值将允许在该列上设置auto_increment。
编辑:有些人问那个0是如何到达那里的。为了澄清起见,《 MySQL参考手册》指出:“对于数字类型,默认值为0,但对于用AUTO_INCREMENT属性声明的整数或浮点类型,默认值为序列中的下一个值。”因此,如果在启用auto_increment之前对表执行插入操作时未提供数值列的值,则在插入过程中将使用默认值0。可以在 https://dev.mysql.com/doc/中找到更多详细信息。refman / 5.0 / en / data-type-defaults.html 。
其他提示
当尝试将一列转换为其中一行的值为0的auto_increment时,我也遇到了这个问题。通过设置可以临时更改0值: 通用标签 会话的
。
这允许将列更改为auto_increment并使用零id。
零不是理想的-而且我也不建议在auto_increment列中使用它。不幸的是,它是继承的数据集的一部分,因此我暂时仍然坚持使用它。
随后最好通过以下方式清除设置(和其他任何设置): 通用标签
尽管会在当前客户端会话结束时清除。
有关“ NO_AUTO_VALUE_ON_ZERO”设置的完整详细信息,这里。
当MySQL无法确定适当的auto_increment值时会发生这种情况。在您的情况下,MySQL选择1
作为下一个auto_increment值,但是表中已经存在具有该值的行。
解决此问题的一种方法是自己选择一个合适的auto_increment值: 通用标签
(请注意最后的AUTO_INCREMENT=123456
。)
编辑:不完全知道该怎么产生,但是我有解决方法。
首先,像旧表一样创建一个新表: 通用标签
然后更改列 通用标签
转储新数据: 通用标签
移动表格: 通用标签
也许正在发生一些损坏,这也会解决该问题。
P.S .:作为荷兰人,我强烈建议您使用英语编码;)
我发现解决此问题的最简单方法是在更改列之前先设置表的AUTO INCREMENT
值。只需确保将自动增量值设置为高于该列中当前的最大值即可:
通用标签
我在MySQL 5.7上进行了测试,对我来说非常有用。
发生这种情况是因为您的主键列已经具有值。
如错误所示...
ALTER TABLE导致自动递增重新排序,导致键“ PRIMARY”的重复条目“ 1”
这意味着您的列已经具有主键值 1 ,当您自动递增该列时,该主键值将被重新分配,从而导致重复,从而导致该错误
解决方案是删除主要约束,然后清空列。然后再次更改设置主键的表,这一次是自动递增。
我有一个类似的问题。问题是该表的记录具有类似于SystemParadox所指出的ID = 0
。我通过以下步骤处理了我的问题:
步骤:
- 将记录id 0更新为
x
,其中x = MAX(id)+1
- 更改表以设置主键和自动增量设置
- 将种子值设置为
x+1
- 将记录id
x
更改回0
代码示例: 通用标签
如果MyISAM表具有组合的AUTO_INCREMENT
PRIMARY KEY
并尝试组合键,也会发生此错误
例如 通用标签
如果该表是相对新的,只有几条记录,则可以截断该表以重置ID值: 通用标签
使用删除不会重置 ID值。 通用标签
清空表格后,您可以应用自动增量。 通用标签