“外键约束”一词经常被扔掉。我只想澄清它的确切含义。我们有一个雇员表和一个分支表。首先创建了employees表,但是它对branch_id应该有一个外键约束,它引用了分支表上id的主(代理)键:
E:\\files\foo.txt
现在我们添加外键约束:
CREATE TABLE employees (
id INT AUTO_INCREMENT,
first_name VARCHAR(40),
last_name VARCHAR(40),
birth_day DATE,
sex BOOLEAN,
salary INT,
supervisor_id INT,
branch_id INT,
PRIMARY KEY(id)
)
CREATE TABLE branches (
id INT AUTO_INCREMENT,
branch_name VARCHAR(40),
manager_id INT,
manager_start_date DATE,
PRIMARY KEY(id),
FOREIGN KEY(manager_id) REFERENCES employees(id) ON DELETE SET NULL
)
请注意,这里我使用的是ALTER TABLE employees
ADD FOREIGN KEY(branch_id)
REFERENCES branches(id)
ON DELETE SET NULL;
ALTER TABLE employees
ADD FOREIGN KEY(supervisor_id)
REFERENCES employees(id)
ON DELETE SET NULL;
,而不是Add Foreign Key
。这是使用Add Constraint constraint_name
的示例:
ADD CONSTRAINT
ALTER TABLE users
ADD CONSTRAINT check_users_age
CHECK (age>=18 AND city='Philadelphia');
和ADD FOREIGN KEY
是同义词吗?实际上,ADD CONSTRAINT constraint_name
是否添加了没有名称的约束?如果ADD FOREIGN KEY
确实添加了名称,我如何在mysql中找到它?
答案 0 :(得分:0)
明确命名约束,即使用CONSTRAINT <name> FOREIGN KEY ...
是可选的。如果您不这样做,即只需使用FOREIGN KEY ...
,系统就会生成一个名称。
约束的效果与其名称无关。因此,显式命名约束(而不是这样做)都是同义词-这与名称无关。
您可以从目录中查询约束,例如来自information_schema.key_column_usage
。
考虑以下示例:
CREATE TABLE a
(id integer,
PRIMARY KEY (id));
CREATE TABLE b
(id integer,
PRIMARY KEY (id));
CREATE TABLE x
(a integer,
b integer,
FOREIGN KEY (a)
REFERENCES a
(id),
CONSTRAINT fancy_name
FOREIGN KEY (b)
REFERENCES b
(id));
SELECT table_name,
column_name,
constraint_name,
referenced_table_name,
referenced_column_name
FROM information_schema.key_column_usage
WHERE table_schema = database()
AND table_name = 'x';
这将导致类似以下内容:
| table_name | column_name | constraint_name | referenced_table_name | referenced_column_name |
| ---------- | ----------- | --------------- | --------------------- | ---------------------- |
| x | b | fancy_name | b | id |
| x | a | x_ibfk_1 | a | id |
您可以看到,系统为约束选择了一个名称。