首页 > 解决方案 > 为外键约束添加或添加约束

问题描述

“外键约束”这个词经常被抛来抛去。我只是想澄清它的确切含义。我们有一个员工表和一个分支机构表。首先创建了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 中找到它?

标签: mysqlsql

解决方案


  • 明确命名约束,即使用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                     |

DB小提琴

您可以看到,系统为约束选择了一个名称。


推荐阅读