mysql - 创建唯一外键表

标签 mysql database foreign-key-relationship unique-constraint create-table

我正在使用 MySQL,并且有两个以下形式的表:

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)  

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

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 表以使外键唯一?

这是我的 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;

我搜索了其他问题,它们涉及为外键创建索引;但我不想通过外键进行索引,我希望约束对于外键对来说是唯一的。

工具:
MySQL服务器版本:5.6.26

注释:

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

最佳答案

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

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 关键字为约束指定一个有意义的名称 - 当您想要弄清楚当约束被违反时会发生什么。

关于mysql - 创建唯一外键表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32661308/

相关文章:

MySql.ConnectorNET.Data 与 MySql.Data

mysql - innodb非识别外键需要 key 存在吗?

php - 加载Product_TYPE ='cars',同时检查last_id是否比ID大

database - ASP.NET MVC5 - 将用户保留在 Oracle 数据库中

null - SQL Server 外键 "On Delete Set Null "约束不起作用

python - 在 Django 中访问具有外键关系的对象?

php - 无法在 Windows LAMP 堆栈上访问 PHPMyAdmin

php - Mysql Join 两个表获取相关数据

sql - 当两个值不匹配时从不同的表中获取数据并替换现有值

mysql - 如何合并两个具有相同架构的 mysql 数据库?