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将自动创建索引。

  • 相关阅读:
    scrapy爬虫框架入门教程
    wing IDE破解方法
    python网络画图——networkX
    Flask Web Development —— Web表单(上)
    pandas聚合和分组运算——GroupBy技术(1)
    Python自然语言工具包(NLTK)入门
    python & pandas链接mysql数据库
    Win10家庭版怎么开启Administrator超级管理员帐户
    Echars保存图片
    Windowserver2008R2安装IIS环境
  • 原文地址:https://www.cnblogs.com/zlslch/p/6534770.html
Copyright © 2011-2022 走看看