我正在使用 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
注释:
- 我没有使用 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/