【问题标题】:table constraints - primary keys in mysql表约束——mysql中的主键
【发布时间】:2020-09-18 07:28:50
【问题描述】:

我有一张下表:

CREATE TABLE `a` (
  `a1` int(11) NOT NULL,
  `a2` int(11) NOT NULL,
  PRIMARY KEY (`a1`,`a2`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 

这里当我赋值时,

insert into a values(1,2);

如果我给之后:

insert into a values(1,20);
insert into a values(10,2);

在这里,我将 a1 和 a2 声明为主键,这意味着默认情况下它是 unique 和 not null。但它接受上面给出的重复项(对于 a1 - (1,2) 和 (1,20))。应该不对吧?只有当我给出时它才会给出错误:

insert into a values(1,2);

ERROR 1062 (23000): Duplicate entry '1-2' for key 'PRIMARY'

而我不能将列(不是列的组合)保留为空。它像对一样执行主键,但在各个列中执行 not null。为什么会这样??谁能解释一下???

【问题讨论】:

  • 主键是唯一键,您已经在 2 列中定义了它,当表中存在两个列值并且您尝试再次插入相同的 2 个值时会出现重复错误。
  • 请参阅文档并证明为什么对是唯一的将意味着各个列是唯一的。 (事实并非如此。)不要只用“不是吗”来声明——如果你不给出你的推理,我们就无法指出你的推理错误。这也是一个常见问题解答。

标签: mysql constraints primary-key


【解决方案1】:

当您声明复合主键(a1 和 a2 一起)时,它们必须是唯一的。这意味着您不能多次插入(1,2)。

如果您需要 a1 和 a2 本身是唯一的,您需要在每一列上创建唯一索引。

ALTER TABLE a
  ADD CONSTRAINT constraint_name UNIQUE KEY(a2);


ALTER TABLE a
  ADD CONSTRAINT constraint_name2 UNIQUE KEY(a1);

主键的作用是为每个表行定义唯一性。

【讨论】:

  • @Strawberry 我编辑了我的答案。我有点分心。对不起:)
【解决方案2】:

在这里,您正在使用复合键。它的功能仅此而已。当您自动声明主键时,not null 约束被添加到两个字段中,这就是它在各个列中起作用的原因,主键的唯一性是此处两个字段的组合

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    • 2015-11-29
    • 1970-01-01
    相关资源
    最近更新 更多