代码之家  ›  专栏  ›  技术社区  ›  Daniel Viglione

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

  •  1
  • Daniel Viglione  · 技术社区  · 6 年前

    “外键约束”一词经常被抛到一边。我只是想澄清它的确切含义。我们有一个雇员表和一个分支表。Employees表是首先创建的,但它应该对branch_id有一个外键约束,该约束引用branches表上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 同义词?做 添加外键 ,实际上,添加一个没有名称的约束?如果 添加外键 是否添加名称,如何在MySQL中找到它?

    1 回复  |  直到 6 年前
        1
  •  0
  •   sticky bit    6 年前
    • 明确命名约束,即使用 CONSTRAINT <name> FOREIGN KEY ... 是可选的。如果你不这样做,也就是说,跟着 FOREIGN KEY ... 系统生成一个名称。

    • 约束的效果与它的名称无关。因此,这两个约束都显式地命名,而不是执行,因此是同义词ish——这是关于名称的除外。

    • 您可以从目录中查询约束,例如从 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

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