• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 使用外键

    在MySQL中,InnoDB表支持检查外键约束。请参见InnoDB存储引擎,以及“外键约束差异”。

    仅仅连接两个表并不需要外键约束。对于除以外的存储引擎InnoDB,可以在定义列时使用没有实际作用的子句,该子句仅作为对您的备忘录或注释,您当前定义的该列打算引用其中的列。另一张桌子。使用此语法时,必须意识到:REFERENCES tbl_name(col_name)

    • MySQL不执行任何形式的检查以确保其col_name实际存在tbl_name(甚至tbl_name本身存在)。
    • MySQL不执行任何类型的操作,tbl_name例如响应定义的表中的行而删除行。换句话说,这种语法不引起ON DELETEON UPDATE行为的任何责任。(尽管您可以将ON DELETEor ON UPDATE子句作为子句的一部分编写REFERENCES,但也将忽略它。)
    • 此语法创建一;它并不会创建任何类型的索引或关键的。

    您可以使用这样创建的列作为联接列,如下所示:

    CREATE TABLE person (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
    name CHAR(60) NOT NULL,
    PRIMARY KEY (id)
    );
    
    CREATE TABLE shirt (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
    style ENUM('t-shirt', 'polo', 'dress') NOT NULL,
    color ENUM('red', 'blue', 'orange', 'white', 'black') NOT NULL,
    owner SMALLINT UNSIGNED NOT NULL REFERENCES person(id),
    PRIMARY KEY (id)
    );
    
    INSERT INTO person VALUES (NULL, 'Antonio Paz');
    
    SELECT @last := LAST_INSERT_ID();
    
    INSERT INTO shirt VALUES
    (NULL, 'polo', 'blue', @last),
    (NULL, 'dress', 'white', @last),
    (NULL, 't-shirt', 'blue', @last);
    
    INSERT INTO person VALUES (NULL, 'Lilliana Angelovska');
    
    SELECT @last := LAST_INSERT_ID();
    
    INSERT INTO shirt VALUES
    (NULL, 'dress', 'orange', @last),
    (NULL, 'polo', 'red', @last),
    (NULL, 'dress', 'blue', @last),
    (NULL, 't-shirt', 'white', @last);
    
    SELECT * FROM person;
    +----	+---------------------	+
    | id  | name                 |
    +----	+---------------------	+
    | 1  | Antonio Paz          |
    | 2  | Lilliana Angelovska  |
    +----	+---------------------	+
    
    SELECT * FROM shirt;
    +----	+---------	+--------	+-------	+
    | id  | style    | color   | owner  |
    +----	+---------	+--------	+-------	+
    | 1  | polo     | blue    | 1  |
    | 2  | dress    | white   | 1  |
    | 3  | t -shirt  | blue    | 1  |
    | 4  | dress    | orange  | 2  |
    | 5  | polo     | red     | 2  |
    | 6  | dress    | blue    | 2  |
    | 7  | t -shirt  | white   | 2  |
    +----	+---------	+--------	+-------	+
    
    SELECT s.* FROM person p INNER JOIN shirt s
    ON s.owner = p.id
    WHERE p.name LIKE 'Lilliana%'
    AND s.color <> 'white';
    
    +----	+-------	+--------	+-------	+
    | id  | style  | color   | owner  |
    +----	+-------	+--------	+-------	+
    | 4  | dress  | orange  | 2  |
    | 5  | polo   | red     | 2  |
    | 6  | dress  | blue    | 2  |
    +----	+-------	+--------	+-------	+
    

    以这种方式使用时,该REFERENCES子句不会显示在SHOW CREATE TABLE或的输出中DESCRIBE

    SHOW CREATE TABLE shirt\G
    *************************** 1. row  ***************************
    Table : shirt
    Create Table : CREATE TABLE `shirt` (
    `id` smallint(5) unsigned NOT NULL auto_increment,
    `style` enum('t-shirt','polo','dress') NOT NULL,
    `color` enum('red','blue','orange','white','black') NOT NULL,
    `owner` smallint(5) unsigned NOT NULL,
    PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4
    

    采用REFERENCES这种方式作为注释或“提示”列定义与工作MyISAM表。