代码之家  ›  专栏  ›  技术社区  ›  Niyaz

如何为MySQL中的多个列指定唯一约束?

  •  771
  • Niyaz  · 技术社区  · 16 年前

    我有一张桌子:

    table votes (
        id,
        user,
        email,
        address,
        primary key(id),
    );
    

    现在我想做专栏 用户、电子邮件、地址 独特(一起)。

    如何在MySQL中执行此操作?

    • 当然,这个例子只是…一个例子。所以请不要担心语义学。
    11 回复  |  直到 6 年前
        1
  •  1278
  •   tsanchev    11 年前
    ALTER TABLE `votes` ADD UNIQUE `unique_index`(`user`, `email`, `address`);
    
        2
  •  202
  •   jmc    8 年前

    我有一个mysql表:

    CREATE TABLE `content_html` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `id_box_elements` int(11) DEFAULT NULL,
      `id_router` int(11) DEFAULT NULL,
      `content` mediumtext COLLATE utf8_czech_ci NOT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `id_box_elements` (`id_box_elements`,`id_router`)
    );
    

    唯一键的工作原理和预期一样,它允许多个空行的id-box-u元素和id-router。

    我运行的是MySQL5.1.42,所以可能上面讨论的问题有一些更新。幸运的是,它起作用了,希望它能一直这样。

        3
  •  44
  •   niksoft    15 年前

    如果行中有一个空值,那么多列唯一索引在MySQL中不起作用,因为MySQL将空值视为唯一值,并且至少当前没有在多列索引中处理它的逻辑。是的,这种行为是疯狂的,因为它限制了许多合法的多列索引应用,但它就是…到目前为止,这是一个已经在mysql bug轨道上标记了“will not fix”的bug…

        4
  •  23
  •   Erick    16 年前

    你试过这个吗?

    UNIQUE KEY `thekey` (`user`,`email`,`address`)
    
        5
  •  11
  •   Code Lღver Ionut Rusen    11 年前

    这适用于MySQL5.5.32版本

    ALTER TABLE  `tablename` ADD UNIQUE (`column1` ,`column2`);
    
        6
  •  6
  •   Vince K    11 年前

    您可以通过添加多个列唯一索引 数据库管理 . (我在4.0.4版中测试过)

    导航到 结构 目标表的页面。向其中一列添加唯一索引。展开 索引 在结构页的底部列出,以查看刚刚添加的唯一索引。单击编辑图标,然后在下面的对话框中,可以向该唯一索引添加其他列。

        7
  •  5
  •   Cristian Botiza    10 年前

    MySQL5或更高版本的行为如下(我刚测试过):

    • 可以定义涉及可为空列的唯一约束。假设您定义了一个唯一的约束(a,b),其中a不可以为空,b是
    • 当计算这样的约束时,您可以根据需要多次使用(空)(相同的值!)
    • 您只能有一对(A,而不是空B)

    例子: 产品名称,产品版本 “玻璃” “玻璃” “酒”,1

    现在,如果您再次尝试插入(“wine”1),它将报告违反约束的情况。 希望这有帮助

        8
  •  2
  •   Sam Malayek    6 年前

    我是这样做的:

    CREATE UNIQUE INDEX index_name ON TableName (Column1, Column2, Column3);
    

    我的约定 index_name TableName_Column1_Column2_Column3_uindex .

        9
  •  1
  •   Taryn Frank Pearson    12 年前

    如果你以后想避免重复的话。创建另一列,比如ID2。

    UPDATE tablename SET id2 = id;
    

    现在在两列中添加唯一:

    alter table tablename add unique index(columnname, id2);
    
        10
  •  1
  •   TheGameiswar    8 年前

    要添加唯一索引,需要以下内容:

    1)表名
    2)索引名称
    3)要添加索引的列

    ALTER TABLE  `tablename` 
    ADD UNIQUE index-name
    (`column1` ,`column2`,`column3`,...,`columnN`);
    

    在您的案例中,我们可以创建以下唯一索引:

    ALTER TABLE `votes`ADD 
    UNIQUE <votesuniqueindex>;(`user` ,`email`,`address`);
    
        11
  •  0
  •   Devendra Singraul    6 年前

    如果要在MySQL中创建表,请使用以下命令:

    create table package_template_mapping (
    mapping_id  int(10) not null auto_increment  ,
    template_id int(10) NOT NULL ,
    package_id  int(10) NOT NULL ,
    remark      varchar(100),
    primary key (mapping_id) ,
    UNIQUE KEY template_fun_id (template_id , package_id)
    );