zoukankan      html  css  js  c++  java
  • 外键约束要求解析(十七)

    一、约束

      1 约束是保证数据的完整性和一致性

      2 ▶ 约束分为表级约束和列级约束

        (1)是根据约束所针对的字段的数目多少决定的。

        (2)表级约束是针对两个或两个以上的字段。

        (3)列级约束是针对某一个字段。

      3 ▶ 约束类型包括(按功能来划分):

        (1)主键约束(PRIMARY KEY)       主键约束(十四)

        (2)唯一约束(UNIQUE KEY)       唯一约束(十五)

        (3)默认约束(DEFAULT)          默认约束(十六)

        (4)非空约束(NOT NULL)         空值(NULL)和非空(NOT NULL)(十二)

        (5)外键约束(FOREIGN KEY)     (本博文)

      

    二、外键约束

      1 ▶ 保证数据一致性,完整性

      2 ▶ 实现数据表中一对一或一对多关系

     

     

     

     

     

     

     

     

     

     

    三、外键约束的要求

      1 ▶ 父表和子表必须使用相同的的存储引擎,而且禁止使用临时表。

          子表指的是有外键的表。

          父表是子表参照的表。 

      2 ▶ 数据表的存储引擎只能为INNODB.

      3 ▶ 外键列和参照列必须具有相似的数据类型。数字的长度或是否有符号位必须相同,而字符的长度则可以不同。

          外键列是增加过for in关键词的那列。

          参照列是外键列参照的列。

      4 ▶ 外键列和参照列必须创建索引。如果外键列不存在索引的话,MYSQL将自动创建索引。

           注意,是外建列而不是参照列。MySQL是不可能为参照列自动创建索引的。

     

     

     

     

    1 父表和子表必须使用相同的的存储引擎,而且禁止使用临时表。

      有外键的表,成为子表。例子中是users数据表

      父表是子表参照的表。例子中是provinces数据表

     

     

     

     

     

     

     

     2 如果数据表的默认存储引擎不是INNODB,该怎么改?

      找到my.ini配置文件

      修改好后,重启生效即可。

      3 外键列和参照列必须具有相似的数据类型。数字的长度或是否有符号位必须相同,而字符的长度则可以不同。这句话什么意思?

    create database dajiangtai;

      

      接下来,我们在数据库dajiangtai里,创建两张数据表,使它们俩有相同的数据类型。

      在数据库dajiangtai里,创建数据表provinces

     create table provinces(
     id smallint unsigned primary key auto_increment,
     Pname varchar(30) not null
     );

    alter database dajiangtai character set utf8;

     alter table provinces character set utf8;

       在数据库dajiangtai里,创建数据表users

    create table users(
    id smallint unsigned primary key auto_increment,
    username varchar(10) not null,
    pid bigint,
    foregin key (pid) references provinces (id)
    );

       即,外建表是users,即子表。

         参照表是provinces,即父表。

        为什么呢。其实,我们这是故意的。在父表provinces,创建id是无符号位,这子表时,不写话,默认是有符号位的。

    也就说,除了要外键列和参照列必须具有相似的数据类型。数字的长度或是否有符号位必须相同!

    create table users if not exists users character set utf8(
    id smallint unsigned primary key auto_increment,
    username varchar(10) not null,
    pid smallint unsigned,
    foregin key (pid) references provinces (id)
    );

      

      

    4  外键列和参照列必须创建索引。如果外键列不存在索引的话,MYSQL将自动创建索引。

    show indexes from provincesG;

    mysql> show indexes from provincesG;
    *************************** 1. row ***************************
    Table: provinces
    Non_unique: 0
    Key_name: PRIMARY
    Seq_in_index: 1
    Column_name: id
    Collation: A
    Cardinality: 0
    Sub_part: NULL
    Packed: NULL
    Null:
    Index_type: BTREE
    Comment:
    1 row in set (0.00 sec)

    ERROR:
    No query specified

      这就是,如果外键列不存在索引的话,MYSQL将自动创建索引。

  • 相关阅读:
    Sum Root to Leaf Numbers
    Sum Root to Leaf Numbers
    Sort Colors
    Partition List
    Binary Tree Inorder Traversal
    Binary Tree Postorder Traversal
    Remove Duplicates from Sorted List II
    Remove Duplicates from Sorted List
    Search a 2D Matrix
    leetcode221
  • 原文地址:https://www.cnblogs.com/zlslch/p/6534770.html
Copyright © 2011-2022 走看看