创建 table 个唯一外键

Create table of unique foreign keys

我正在使用 MySQL 并且我有两个 table 形式:

mysql> describe ing_categories;
+-------------+------------------+------+-----+---------+----------------+
| Field       | Type             | Null | Key | Default | Extra          |
+-------------+------------------+------+-----+---------+----------------+
| ID_Category | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| category    | varchar(64)      | NO   | UNI | NULL    |                |
+-------------+------------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

mysql> describe ing_titles;
+----------+------------------+------+-----+---------+----------------+
| Field    | Type             | Null | Key | Default | Extra          |
+----------+------------------+------+-----+---------+----------------+
| ID_Title | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| title    | varchar(128)     | NO   | UNI | NULL    |                |
+----------+------------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)  

我有第三个table包含外键记录,外键是上面的table:

mysql> describe ing_title_categories;
+-------------------+------------------+------+-----+---------+----------------+
| Field             | Type             | Null | Key | Default | Extra          |
+-------------------+------------------+------+-----+---------+----------------+
| ID_Title_Category | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| ID_Title          | int(10) unsigned | NO   | MUL | NULL    |                |
| ID_Category       | int(10) unsigned | NO   | MUL | NULL    |                |
+-------------------+------------------+------+-----+---------+----------------+  

如何创建 ing_titles_categories table 以便 外键是唯一的?

这是我的 SQL 声明:

CREATE TABLE ing_title_categories
(
    ID_Title_Category INTEGER UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
    ID_Title INTEGER UNSIGNED NOT NULL,
    ID_Category INTEGER UNSIGNED NOT NULL,
    FOREIGN KEY fk_title(ID_Title)
        REFERENCES ing_titles(ID_Title)
        ON UPDATE CASCADE
        ON DELETE RESTRICT,
    FOREIGN KEY fk_category(ID_Category)
        REFERENCES ing_categories(ID_Category)
        ON UPDATE CASCADE
        ON DELETE RESTRICT
) ENGINE=InnoDB;

我搜索了其他问题,它们涉及为外键建立索引;但我不想通过外键索引,我希望外键对unique 的约束是.

工具:
MySQL服务器版本:5.6.26

备注:

  1. 我没有使用 PHP,而是通过 MySQL C++ 连接器使用 C++,所以请不要 PHP 示例。

您可以将 ID_TitleID_Category 列上的 UNIQUE KEY 约束定义为复合唯一 (UNIQUE(ID_Title , ID_Category)) 键,这将确保上述键列的组合总是独一无二的。

ALTER TABLE ing_title_categories
   ADD CONSTRAINT uniqueconstraint UNIQUE(`ID_Title` , `ID_Category`);

您添加了唯一键或主键约束。这是一个例子:

CREATE TABLE ing_title_categories
(
    ID_Title_Category INTEGER UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
    ID_Title INTEGER UNSIGNED NOT NULL,
    ID_Category INTEGER UNSIGNED NOT NULL,
    FOREIGN KEY fk_title(ID_Title)
        REFERENCES ing_titles(ID_Title)
        ON UPDATE CASCADE
        ON DELETE RESTRICT,
    FOREIGN KEY fk_category(ID_Category)
        REFERENCES ing_categories(ID_Category)
        ON UPDATE CASCADE
        ON DELETE RESTRICT,
    UNIQUE (ID_Title, ID_Category)
) ENGINE=InnoDB;

唯一约束的实施确实创建了一个索引。但是,需要该索引来强制执行约束。它还将在适当的情况下用于查询。

请注意,这等同于:

create unique index idx_ing_title_categories_2 on ing_title_categories(ID_Title, ID_Category);

将约束放在 CREATE TABLE 语句中的一个优点是您可以使用 CONSTRAINT 关键字为约束指定一个有意义的名称——当您想弄清楚发生了什么时很有用当约束被违反时。