【问题标题】:MySQL - Unique foreign keyMySQL - 唯一外键
【发布时间】:2011-03-15 13:00:33
【问题描述】:

我必须使其中一个外键唯一。问题是,我从 phpMyAdmin 收到以下消息:

以下索引似乎相等,应删除其中一个:consignmentnumber_id_UNIQUE、fk_consignments_consignmentnumbers2

所以我的问题是:我应该被打扰吗?没有这样的索引真的很重要吗?

【问题讨论】:

    标签: mysql foreign-keys unique


    【解决方案1】:

    每个带有键(主键、外键)的列都需要一个索引。与列是唯一的相同。您可能创建了两个索引(一个在创建 FK 时创建,一个在唯一约束上创建)。如果是这种情况,只需删除其中一个索引。

    数据库维护两个等效索引是开销。

    【讨论】:

    • 您可以补充一点,在 MySQL 中创建 FOREIGN KEY 实际上会在引用列和被引用列上创建一个 INDEX,除非已经存在。
    • 所以你是说我可以删除唯一索引并且列将保持唯一?我通过在 MySQL Workbench 中选中“唯一”来添加此索引。
    • 目前我猜你有 INDEX 和 UNIQUE 类型的 2 个索引。如果是这种情况,您应该删除 INDEX 之一。 UNIQUE 是唯一的,对于 FK 来说就足够了。
    • dev.mysql.com/doc/refman/5.0/en/create-index.html,UNIQUE是特殊类型的INDEX,INDEX是通用索引。
    • +1 用于参考文档。但是当两个索引相同时会导致问题吗?我正在尝试更新具有两个索引(都在外键上)的记录,并且我的逻辑有时会失败。索引键可以减慢这个操作吗?
    【解决方案2】:
    mysql > create unique index index_bar_id on foos(bar_id);
    mysql > alter table foos add constraint index_bar_id foreign key (bar_id) references bars (id);
    

    阅读更多http://sixarm.com/about/mysql-create-indexes-foreign-keys-constraints.html

    【讨论】:

      【解决方案3】:

      未来,如果你想让你的外键唯一,你可以像这样简单地修改你的外键列:

      ALTER TABLE your_table
      MODIFY COLUMN your_fk_column [INT, VARCHAR etc.][NOT NULL] UNIQUE;
      

      【讨论】:

        【解决方案4】:

        如您所知,您似乎也可以拥有 UNIQUE 外键:

        CREATE TABLE user(
        uid INT NOT NULL AUTO_INCREMENT,
        username VARCHAR(16) NOT NULL UNIQUE,
        email_id INT NOT NULL UNIQUE,
        FOREIGN KEY (email_id) REFERENCES email(uid)
            ON DELETE CASCADE
            ON UPDATE CASCADE,
        
        PRIMARY KEY (uid));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-22
          • 1970-01-01
          • 1970-01-01
          • 2011-03-30
          • 2012-08-20
          • 2011-01-26
          相关资源
          最近更新 更多