为外键约束添加或添加约束

时间:2019-01-20 17:18:32

标签: mysql sql

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

1 个答案:

答案 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                     |

DB Fiddle

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