创建 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
备注:
- 我没有使用 PHP,而是通过 MySQL C++ 连接器使用 C++,所以请不要 PHP
示例。
您可以将 ID_Title
和 ID_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
关键字为约束指定一个有意义的名称——当您想弄清楚发生了什么时很有用当约束被违反时。
我正在使用 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
备注:
- 我没有使用 PHP,而是通过 MySQL C++ 连接器使用 C++,所以请不要 PHP 示例。
您可以将 ID_Title
和 ID_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
关键字为约束指定一个有意义的名称——当您想弄清楚发生了什么时很有用当约束被违反时。