【问题标题】:How do I specify unique constraint for multiple columns in MySQL?如何为 MySQL 中的多个列指定唯一约束?
【发布时间】:2010-10-12 18:21:27
【问题描述】:

我有一张桌子:

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

现在我想让列用户、电子邮件、地址唯一(一起)。

如何在 MySql 中做到这一点?

当然,这个例子只是……一个例子。所以请不要担心语义。

【问题讨论】:

    标签: mysql unique-constraint composite-key database-table


    【解决方案1】:

    要添加唯一约束,需要使用两个组件:

    ALTER TABLE - 更改表架构,

    ADD UNIQUE - 添加唯一约束。

    然后您可以使用 'name'('column1', 'column2'...) 格式定义新的唯一键

    因此,对于您的特定问题,您可以使用以下命令:

    ALTER TABLE `votes` ADD UNIQUE `unique_index`(`user`, `email`, `address`);
    

    【讨论】:

    • 对于那些使用 MySQL 工作台的人:转到索引选项卡并选择 UNIQUE 作为您的类型。为您的索引命名并检查“索引列”部分下的相应列
    • 像我一样,如果其他人从搜索引擎中找到了这个......并回答 Clizzin 关于 ON DUPLICATE KEY 是否可以使用复合键的问题 - 它绝对可以,但是需要一些小的调整到语法。见stackoverflow.com/questions/9537710/…
    【解决方案2】:

    你试过了吗?

    UNIQUE KEY `thekey` (`user`,`email`,`address`)
    

    【讨论】:

    • 埃里克所说的对我来说很好用:UNIQUE KEY thekey` (user,email,address)`。我正在使用 MYSQL 版本 5.5.24 如果您正在使用它,您甚至可以在 PHPMYADMIN 中设置它。我使用的是 3.5.1 版本的 PMA。
    • 用 MySql 5.6 试过了。从第一次尝试开始工作。谢谢埃里克!
    【解决方案3】:

    如果行中有 NULL 值,则多列唯一索引在 MySQL 中不起作用,因为 MySQL 将 NULL 视为唯一值,并且至少目前没有逻辑可以在多列索引中解决它。是的,这种行为很疯狂,因为它限制了多列索引的许多合法应用程序,但它就是这样......到目前为止,这是一个在 MySQL 上被标记为“将无法修复”的错误错误跟踪...

    【讨论】:

      【解决方案4】:

      我有一个 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 `my_uniq_id` (`id_box_elements`,`id_router`)
      );
      

      并且 UNIQUE KEY 的工作方式与预期一样,它允许 id_box_elements 和 id_router 的多个 NULL 行。

      我正在运行 MySQL 5.1.42,因此可能对上面讨论的问题进行了一些更新。幸运的是它有效,希望它会保持这种状态。

      【讨论】:

      • 我想标记这个答案,因为它确实向您展示了如何创建一个具有唯一索引的新表,而上面 jonstjohn 的答案告诉您如何更新现有表。他们做同样的事情只是取决于您是创建新表还是更新现有表。 :)
      【解决方案5】:

      如果您想在将来避免重复。创建另一个列,例如 id2。

      UPDATE tablename SET id2 = id;
      

      现在在两列上添加唯一性:

      alter table tablename add unique index(columnname, id2);
      

      【讨论】:

        【解决方案6】:

        这适用于 mysql 版本 5.5.32

        ALTER TABLE  `tablename` ADD UNIQUE (`column1` ,`column2`);
        

        【讨论】:

          【解决方案7】:

          您可以通过 phpMyAdmin 添加多列唯一索引。 (我在4.0.4版本测试过)

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

          【讨论】:

            【解决方案8】:

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

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

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

            在您的情况下,我们可以按如下方式创建唯一索引:

            ALTER TABLE `votes`ADD 
            UNIQUE <votesuniqueindex>;(`user` ,`email`,`address`);
            

            【讨论】:

              【解决方案9】:

              MySql 5 或更高版本的行为是这样的(我刚刚测试过):

              • 您可以定义涉及可空列的唯一约束。假设您定义了一个唯一的约束 (A, B),其中 A 不可为空,但 B 是
              • 在评估此类约束时,您可以根据需要多次使用 (A, null)(相同的 A 值!)
              • 你只能有一对(A,不是空 B)

              示例: PRODUCT_NAME、PRODUCT_VERSION '玻璃',空 '玻璃',空 '酒',1

              现在,如果您再次尝试插入 ('wine' 1),它将报告违反约束 希望这会有所帮助

              【讨论】:

                【解决方案10】:

                我是这样做的:

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

                我对唯一index_name 的约定是TableName_Column1_Column2_Column3_uindex

                【讨论】:

                  【解决方案11】:

                  如果您在 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)
                  );
                  

                  【讨论】:

                    【解决方案12】:

                    首先摆脱现有的重复项

                    delete a from votes as a, votes as b where a.id < b.id 
                    and a.user <=> b.user and a.email <=> b.email 
                    and a.address <=> b.address;
                    

                    然后添加唯一约束

                    ALTER TABLE votes ADD UNIQUE unique_index(user, email, address);
                    

                    验证约束
                    SHOW CREATE TABLE votes;
                    

                    请注意,如果其中任何一个包含 null 值,则用户、电子邮件、地址将被视为唯一。

                    【讨论】:

                      【解决方案13】:

                      对于 PostgreSQL... 索引对我不起作用;它给了我一个错误,所以我这样做了:

                      alter table table_name
                      add unique(column_name_1,column_name_2);
                      

                      PostgreSQL 给唯一索引起了自己的名字。我猜你可以在表的选项中更改索引的名称,如果需要更改...

                      【讨论】:

                        【解决方案14】:

                        本教程适合我

                        ALTER TABLE table_name
                        ADD CONSTRAINT constraint_name UNIQUE (column1, column2, ... column_n);
                        

                        https://www.mysqltutorial.org/mysql-unique-constraint/

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 1970-01-01
                          • 2019-02-27
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2012-08-10
                          相关资源
                          最近更新 更多