【问题标题】:Unique table constraint唯一表约束
【发布时间】:2021-01-22 06:27:59
【问题描述】:

我有一张如下表:

CREATE TABLE `b` (
  `b1` int(11) DEFAULT NULL,
  `b2` int(11) DEFAULT NULL,
  UNIQUE KEY `b1` (`b1`,`b2`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

这里,为 2 个字段提供了唯一表约束。但是,在 show create table 查询中,它就像 UNIQUE KEY b1 (b1,b2) 第一个字段 b1 充当唯一键,其中 b2被合并了。

我可以放弃b1 的约束,但不能放弃b2:

mysql> alter table b drop index b2;
ERROR 1091 (42000): Can't DROP 'b2'; check that column/key exists

mysql> alter table b drop index b1;
Query OK, 0 rows affected (0.41 sec)
Records: 0  Duplicates: 0  Warnings: 0

需要的答案:

  1. 为什么此唯一约束仅适用于一个字段(第一次提到的字段)?
  2. 唯一表约束的结构是这样的吗?
  3. 非常需要参考链接的任何附件

提前致谢

【问题讨论】:

    标签: mysql constraints unique-constraint unique-key unique-index


    【解决方案1】:

    在您的情况下,b1 只是 UNIQUE KEY 的名称。因为您在 create table 语句中没有为约束指定名称,所以它通过第一列名称 (b1) 隐式命名。它会检查 b1 和 b2 对的唯一性 对于创建命名密钥,您可以使用下一条语句:

    create table b (
      b1 int, b2 int, 
      unique key b1b2_uk (b1,b2)
    );
    

    这里创建了unique key,命名为b1b2_uk

    看例子here

    如果你想删除约束,你应该使用它的名字:

    alter table b drop index b1b2_uk;
    

    对于更改约束,您需要删除现有并创建新的,例如:

    alter table b 
        drop index b1b2_uk,
        add primary key b1_pk (b1); 
    

    看SQLize.online的小提琴

    【讨论】:

      【解决方案2】:

      如果表格看起来像这样可能更容易理解:

      CREATE TABLE `b` (
        `b1` int(11) DEFAULT NULL,
        `b2` int(11) DEFAULT NULL,
        UNIQUE KEY `my_unique_index` (`b1`,`b2`)
      ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
      
      alter table b drop index my_unique_index;
      

      明白了吗?

      【讨论】:

        猜你喜欢
        • 2018-02-02
        • 2010-10-11
        • 1970-01-01
        • 1970-01-01
        • 2015-03-06
        • 2012-10-27
        • 2019-09-25
        • 2015-06-07
        • 2011-05-28
        相关资源
        最近更新 更多