mysql - 为外键约束添加或添加约束
问题描述
“外键约束”这个词经常被抛来抛去。我只是想澄清它的确切含义。我们有一个员工表和一个分支机构表。首先创建了employees表,但它应该对branch_id有一个外键约束,它引用了branchs表上id的主(代理)键:
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
实际上,是否添加了一个没有名称的约束?如果ADD FOREIGN KEY
确实添加了名称,我如何在 mysql 中找到它?
解决方案
明确命名约束,即使用
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 |
您可以看到,系统为约束选择了一个名称。
推荐阅读
- java - 是否可以在 java 中基于 LocalDateTime 打印某个字符串?
- python-3.x - 基于路由查找列表中元素的组合
- python - 如何在 Pandas 中合并日期和时间?
- python - 如何在使用网格系统并添加文本换行时更改 tkinter 中的条目高度?
- pandas - 从日期时间数据类型中提取年份将输出作为浮点数
- python - 我无法让 json.loads 工作 - 不理解错误消息
- microsoft-graph-api - 在团队中创建新频道时的 Microsoft 图形通知
- python - 如何“修复” tkinter.Listbox 中的选定项目?
- python - 在python中命名嵌套字典
- scala - 如何在 Gatling 脚本的每个请求中动态传递纪元时间戳