【问题标题】:What causes duplicate PKs in MySQL?是什么导致 MySQL 中的重复 PK?
【发布时间】:2012-03-12 20:10:02
【问题描述】:

到目前为止,我遇到过很多次,但仍然不明白(我的 MySQL 内部技能等于没有)。

我知道它可能是 PEBKAC,但尝试手动复制该行为最终会出现错误(自动增量)。

CREATE TABLE `foo_bar` (
  `id` int(12) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(12) unsigned DEFAULT NULL,
  `order_id` int(12) unsigned DEFAULT NULL,
  `email_address` varchar(50) DEFAULT NULL,
  `mobile_number` varchar(20) DEFAULT NULL,
  `message` longtext NOT NULL,
  `message_received` int(12) unsigned DEFAULT NULL,
  `failed_to_send` tinyint(1) unsigned DEFAULT NULL,
  `fraudulent_activity` tinyint(1) unsigned DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=ARCHIVE DEFAULT CHARSET=utf8;

【问题讨论】:

  • 我觉得这很难相信。根据定义,主键是唯一的,甚至不应该允许 NULL 值。如果 MySQL 允许这样做,我怀疑有人会考虑使用 MySQL。
  • 你能发布你的创建表脚本吗?
  • 我假设该表有多个 PK。如果一个表有两个 PK,那么它将创建一个包含两个列值的字符串,并连接起来。然后唯一性基于该值。因此,如果您在 xy 上进行了 PK,您可以拥有 x -> 1, y -> 1x -> 1, y -> 2,但如果您再次尝试 x -> 1, y -> 1,它将失败(y 也是如此)。
  • @Kemo 那么问题不在于 MySQL 是否允许重复 PK,问题在于您正在查看的数据库没有定义主键,也许是因为,正如您所提到的,它是用于存档目的,不需要此约束。
  • AUTO_INCREMENT 不一定表示 UNIQUEPRIMARY 键。表是否有主键或唯一键?

标签: mysql primary-key archive auto-increment


【解决方案1】:

当您的程序在数据库中插入一行时,它应该提供 NULL 作为自动递增字段的值:

CREATE TABLE  `customers` (
    `id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    `name` VARCHAR( 128 ) NOT NULL
) ENGINE = MYISAM ;


INSERT INTO  `customers` ( `id` , `name` )
VALUES ( NULL ,  'Customer 1' ), ( NULL ,  'Customer 2' );

如果你尝试在id字段中插入一个特定的值,MySQL会报错:

SQL query: 

    INSERT INTO  `customers` ( `id` , `name` )
    VALUES ( '1',  'Customer 3' );

MySQL said: 
#1062 - Duplicate entry '1' for key 'PRIMARY' 

【讨论】:

  • 谢谢,但我已经说过尝试手动复制行为最终会出错:)
【解决方案2】:

虽然没有给出“是什么原因造成的”的答案,但REPAIR TABLE 解决了这个问题。

回答这个问题,这样我就可以结束这个问题了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    相关资源
    最近更新 更多