zoukankan      html  css  js  c++  java
  • 3.6.6使用外键

     

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

    仅仅连接两个表并不需要外键约束。对于除以外的存储引擎 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 shirtG
    *************************** 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表一起使用。

  • 相关阅读:
    Select * 一定不走索引是否正确?
    csshack技术
    ios学习笔记之UIViewControl生命周期
    selenium webdriver (python)
    string中Insert与Format效率对比、String与List中Contains与IndexOf的效率对比
    HDU 2083 简易版之最短距离
    xtrabackup支持的engine
    C++可变参数的另一种实现
    程序员应具备的素质(国内的大多程序员生产力不够,所以只能早早转行)
    Qt导出Excel的简单实现
  • 原文地址:https://www.cnblogs.com/owlin/p/13731008.html
Copyright © 2011-2022 走看看