• 数据库操作(一)


    数据库操作(一)

    1.库操作

    数据库命名规则:

    • 由字母、数字和下划线组成;
    • 大小写区分;
    • 唯一性;
    • 不能使用关键字;
    • 最长128位;
    • 不能单独使用数字.

    库相关操作

    查看数据库:
        show databases;
        show create database db1;
        select database(); #查看当前所在的库
    选择数据库:
        use db1
    增:
        create database db1 charset utf8;
    改:
        alter database db1 charset gbk;
    删:
        drop database db1;
    

    2.表操作

    表相关操作

    先切换到文件夹下: use db1
        
    增:
        create table t1(id int,name char(10));
        create table 表名(字段名1 类型[(宽度) 约束条件],字段名2 类型[(宽度) 约束条件]);
        
    查:
        show tables;       #查看所有表
        desc t1;           #查看表结构
        show create table t1; #查看表详细结构
        
    改:
        alter table t1 modify name char(3);
        alter table t1 change name name1;
        
    删:
        drop table t1;
        
    注意:
        1.在同一张表中,字段名不能相同
        2.宽度和约束类型可选
        3.字段名和类型时必须的
    

    3.MySQL基础数据类型

    MySQL常用数据类型概览

    1.数字
    整型:
        tinyint int bigint
    小数:
        float:在位数比较短的情况下不精准
        double:在位数比较长的情况下不精准
        decimal:如果用小数,则推荐使用decimal
            	精准,内部原理是以字符串形式存储
    字符串:
        char:定长存储,存取速度快,浪费空间
        vachar:变长存储,精准,存取速度慢,节省空间
        #sql优化:创建表时,定长类型往前放(比如性别)变长类型往后放(比如地址或描述信息),>255个字符就把文件路径存放到数据库中
        
    时间类型:
        date datetime
    枚举和集合类型:
        emu set
    

    数据类型详解

    1.整数类型和浮点型

    MySQL支持所有标准SQL数值数据类型。

    这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。

    关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。

    MySQL支持的整数类型有TINYINT、MEDIUMINT和BIGINT。下面的表显示了需要的每个整数类型的存储和范围。

    对于小数的表示,MYSQL分为两种方式:浮点数和定点数。浮点数包括float(单精度)和double(双精度),而定点数只有decimal一种,在mysql中以字符串的形式存放,比浮点数更精确,适合用来表示货币等精度高的数据。

    BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。

    整数类型作用:存储年龄、等级、id、各种号码等

    浮点型作用:存储薪资、身高、温度、体重、体质参数等

    类型 大小 范围(有符号) 范围(无符号)unsigned约束 用途
    TINYINT 1 字节 (-128,127) (0,255) 小整数值
    SMALLINT 2 字节 (-32 768,32 767) (0,65 535) 大整数值
    MEDIUMINT 3 字节 (-8 388 608,8 388 607) (0,16 777 215) 大整数值
    INT或INTEGER 4 字节 (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
    BIGINT 8 字节 (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值
    FLOAT 4 字节float(255,30) (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 单精度 浮点数值
    DOUBLE 8 字节double(255,30) (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度 浮点数值
    DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2double(65,30) 依赖于M和D的值 依赖于M和D的值 小数值
    整数类型分类:
        
    tinyint[(m)] [unsigned] [zerofill]
    小整数,数据类型用于保存一些范围的整数数值范围:
        有符号:
            -128 ~ 127
        无符号:
            0 ~ 255
    
        PS: MySQL中无布尔值,使用tinyint(1)构造。
    
    
    
    int[(m)][unsigned][zerofill]
    整数,数据类型用于保存一些范围的整数数值范围:
        有符号:
            -2147483648 ~ 2147483647
        无符号:
            0 ~ 4294967295
    
    
    
    bigint[(m)][unsigned][zerofill]
    大整数,数据类型用于保存一些范围的整数数值范围:
        有符号:
            -9223372036854775808 ~ 9223372036854775807
        无符号:
            0  ~  18446744073709551615
    
    整数类型范围验证:
        
    有符号和无符号tinyint
        1.tinyint默认为有符号
            mysql> create table t1(x tinyint); #默认为有符号,即数字前有正负号
            mysql> desc t1;
            mysql> insert into t1 values
                -> (-129),
                -> (-128),
                -> (127),
                -> (128);
            mysql> select * from t1;
            +------+
            | x    |
            +------+
            | -128 | #-129存成了-128
            | -128 | #有符号,最小值为-128
            |  127 | #有符号,最大值127
            |  127 | #128存成了127
            +------+
    
    
    
        2.设置无符号tinyint
            mysql> create table t2(x tinyint unsigned);
            mysql> insert into t2 values
                -> (-1),
                -> (0),
                -> (255),
                -> (256);
            mysql> select * from t2;
            +------+
            | x    |
            +------+
            |    0 | -1存成了0
            |    0 | #无符号,最小值为0
            |  255 | #无符号,最大值为255
            |  255 | #256存成了255
            +------+
    
    
    
    有符号和无符号int
        1.int默认为有符号
            mysql> create table t3(x int); #默认为有符号整数
            mysql> insert into t3 values
                -> (-2147483649),
                -> (-2147483648),
                -> (2147483647),
                -> (2147483648);
            mysql> select * from t3;
            +-------------+
            | x           |
            +-------------+
            | -2147483648 | #-2147483649存成了-2147483648
            | -2147483648 | #有符号,最小值为-2147483648
            |  2147483647 | #有符号,最大值为2147483647
            |  2147483647 | #2147483648存成了2147483647
            +-------------+
    
    
    
        2.设置无符号int
            mysql> create table t4(x int unsigned);
            mysql> insert into t4 values
                -> (-1),
                -> (0),
                -> (4294967295),
                -> (4294967296);
            mysql> select * from t4;
            +------------+
            | x          |
            +------------+
            |          0 | #-1存成了0
            |          0 | #无符号,最小值为0
            | 4294967295 | #无符号,最大值为4294967295
            | 4294967295 | #4294967296存成了4294967295
            +------------+
    
    
    
    
    有符号和无符号bigint
        1.有符号bigint
            mysql> create table t5(x bigint);
            mysql> insert into t5 values  
                -> (-9223372036854775809),
                -> (-9223372036854775808),
                -> (9223372036854775807),
                -> (9223372036854775808);
    
            mysql> select * from t5;
            +----------------------+
            | x                    |
            +----------------------+
            | -9223372036854775808 |
            | -9223372036854775808 |
            |  9223372036854775807 |
            |  9223372036854775807 |
            +----------------------+
    
    
        2.无符号bigint
            mysql> create table t6(x bigint unsigned);
            mysql> insert into t6 values  
                -> (-1),
                -> (0),
                -> (18446744073709551615),
                -> (18446744073709551616);
    
            mysql> select * from t6;
            +----------------------+
            | x                    |
            +----------------------+
            |                    0 |
            |                    0 |
            | 18446744073709551615 |
            | 18446744073709551615 |
            +----------------------+
    
    
    
    
    用zerofill测试整数类型的显示宽度
        mysql> create table t7(x int(3) zerofill);
        mysql> insert into t7 values
            -> (1),
            -> (11),
            -> (111),
            -> (1111);
        mysql> select * from t7;
        +------+
        | x    |
        +------+
        |  001 |
        |  011 |
        |  111 |
        | 1111 | #超过宽度限制仍然可以存
        +------+
    
    #设置了数据类型,会有约束效果,只能表示本类型范围内的数
    
    浮点型分类:
        
    1.FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
    
    定义:
    单精度浮点数(非准确小数值),m是整数部分+小数部分的总个数,d是小数点后个数。m最大值为255,d最大值为30,例如:float(255,30)
    
    有符号:
           -3.402823466E+38 to -1.175494351E-38,
           
    无符号:
           1.175494351E-38 to 3.402823466E+38
    
    精确度: 
           **** 随着小数的增多,精度变得不准确 ****
    
    
    
    2.DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
    
    定义:
       双精度浮点数(非准确小数值),m是整数部分+小数部分的总个数,d是小数点后个数。m最大值也为255,d最大值也为30
    
    有符号:
       -1.7976931348623157E+308 to -2.2250738585072014E-308
    
    无符号:
       2.2250738585072014E-308 to 1.7976931348623157E+308
                    
    精确度:
       ****随着小数的增多,精度比float要高,但也会变得不准确 ****
    
    
    3.decimal[(m[,d])] [unsigned] [zerofill]
    
    定义:
      准确的小数值,m是整数部分+小数部分的总个数(负号不算),d是小数点后个数。 m最大值为65,d最大值为30。比float和double的整数个数少,但是小数位数都是30位
    
    
    精确度:
       **** 随着小数的增多,精度始终准确 ****
       对于精确数值计算时需要用此类型
    	decimal能够存储精确值的原因在于其内部按照字符串存储。
    
    精度从高到低:decimal、double、float
        decimal精度高,但是整数位数少
        float和double精度低,但是整数位数多
    float已经满足绝大多数的场景了,但是什么导弹、航线等要求精度非常高,所以还是需要按照业务场景自行选择,如果又要精度高又要整数位数多,那么你可以直接用字符串来存。
    
    
    浮点型测试:
        
    mysql> create table t8(x float(256,31));
    ERROR 1425 (42000): Too big scale 31 specified for column 'x'. Maximum is 30.
        
    mysql> create table t8(x float(256,30));
    ERROR 1439 (42000): Display width out of range for column 'x' (max = 255)
        
    mysql> create table t8(x float(255,30)); #建表成功
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> create table t9(x double(255,30)); #建表成功
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> create table t10(x decimal(66,31));
    ERROR 1425 (42000): Too big scale 31 specified for column 'x'. Maximum is 30.
        
    mysql> create table t10(x decimal(66,30));
    ERROR 1426 (42000): Too-big precision 66 specified for 'x'. Maximum is 65.
        
    mysql> create table t10(x decimal(65,30)); #建表成功
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> show tables;
    +---------------+
    | Tables_in_db1 |
    +---------------+
    | t8            |
    | t9            |
    | t10            |
    +---------------+
    rows in set (0.00 sec)
    
    
    mysql> insert into t8 values(1.1111111111111111111111111111111); #小数点后31个1
    Query OK, 1 row affected (0.01 sec)
    
    mysql> insert into t9 values(1.1111111111111111111111111111111);
    Query OK, 1 row affected (0.00 sec)
    
    mysql> insert into t10 values(1.1111111111111111111111111111111);
    Query OK, 1 row affected, 1 warning (0.01 sec)
    
    mysql> select * from t8; #随着小数的增多,精度开始不准确
    +----------------------------------+
    | x                                |
    +----------------------------------+
    | 1.111111164093017600000000000000 |
    +----------------------------------+
    row in set (0.00 sec)
    
    
    mysql> select * from t9; #精度比float要准确点,但随着小数的增多,同样变得不准确
    +----------------------------------+
    | x                                |
    +----------------------------------+
    | 1.111111111111111200000000000000 |
    +----------------------------------+
    row in set (0.00 sec)
    
    
    mysql> select * from t10; #精度始终准确,d为30,于是只留了30位小数
    +----------------------------------+
    | x                                |
    +----------------------------------+
    | 1.111111111111111111111111111111 |
    +----------------------------------+
    row in set (0.00 sec)
    
    

    2.位类型

    BIT(M)可以用来存放多位二进制数,M范围从1~64,如果不写默认为1位。
        注意:对于位字段需要使用函数读取
        bin()显示为二进制
        hex()显示为十六进制

    位类型测试:
        
    mysql> create table t0(id bit);
    mysql> desc t0; #bit默认宽度为1
    +-------+--------+------+-----+---------+-------+
    | Field | Type   | Null | Key | Default | Extra |
    +-------+--------+------+-----+---------+-------+
    | id    | bit(1) | YES  |     | NULL    |       |
    +-------+--------+------+-----+---------+-------+
    
    mysql> insert into t0 values(8);
    mysql> select * from t0; #直接查看是无法显示二进制位的
    +------+
    | id   |
    +------+
    |     |
    +------+
    mysql> select bin(id),hex(id) from t0; #需要转换才能看到
    +---------+---------+
    | bin(id) | hex(id) |
    +---------+---------+
    | 1       | 1       |
    +---------+---------+
    
    mysql> alter table t0 modify id bit(5);
    mysql> insert into t0 values(8);
    mysql> select bin(id),hex(id) from t0;
    +---------+---------+
    | bin(id) | hex(id) |
    +---------+---------+
    | 1       | 1       |
    | 1000    | 8       |
    +---------+---------+
    
    位类型测试
    

    3.字符串类型

    字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。

    类型 大小 用途
    CHAR 0-255字节 定长字符串
    VARCHAR 0-65535 字节 变长字符串
    TINYBLOB 0-255字节 不超过 255 个字符的二进制字符串
    TINYTEXT 0-255字节 短文本字符串
    BLOB 0-65 535字节 二进制形式的长文本数据
    TEXT 0-65 535字节 长文本数据
    MEDIUMBLOB 0-16 777 215字节 二进制形式的中等长度文本数据
    MEDIUMTEXT 0-16 777 215字节 中等长度文本数据
    LONGBLOB 0-4 294 967 295字节 二进制形式的极大文本数据
    LONGTEXT 0-4 294 967 295字节 极大文本数据
    char/vachar类型介绍
    
    #注意:char和varchar括号内的参数指的都是字符的长度
    
    #char类型:定长,简单粗暴,浪费空间,存取速度快
    字符长度范围:0-255(一个中文是一个字符,是utf8编码的3个字节)
    存储:
        存储char类型的值时,会往右填充空格来满足长度
        例如:指定长度为10,存>10个字符则报错(严格模式下),存<10个字符则用空格填充直到凑够10个字符存储
    
    检索:
        在检索或者说查询时,查出的结果会自动删除尾部的空格,如果你想看到它补全空格之后的内容,除非我们打开pad_char_to_full_length SQL模式(SET sql_mode = 'strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH';)
    
    #varchar类型:变长,精准,节省空间,存取速度慢
        字符长度范围:0-65535(如果大于21845会提示用其他类型 。mysql行最大限制为65535字节,字符编码为utf-8:https://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html)
    存储:
        varchar类型存储数据的真实内容,不会用空格填充,如果'ab  ',尾部的空格也会被存起来
        强调:varchar类型会在真实数据前加1-2Bytes的前缀,该前缀用来表示真实数据的bytes字节数(1-2Bytes最大表示65535个数字,正好符合mysql对row的最大字节限制,即已经足够使用)
        
        如果真实的数据<255bytes则需要1Bytes的前缀(1Bytes=8bit 2**8最大表示的数字为255)
        如果真实的数据>255bytes则需要2Bytes的前缀(2Bytes=16bit 2**16最大表示的数字为65535)
        
    检索:
        尾部有空格会保存下来,在检索或者说查询时,也会正常显示包含空格在内的内容
    
    
    
    char/varchar测试:
        
    mysql> create table t10 (v varchar(4),c char(4));
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> insert into t10 values ('ab  ','ab  ');
    Query OK, 1 row affected (0.00 sec)
    
    # 在检索的时候char数据类型会去掉空格
    mysql> select * from t10;
    +------+------+
    | v    | c    |
    +------+------+
    | ab   | ab   |
    +------+------+
    row in set (0.00 sec)
    
    # 来看看对查询结果计算的长度
    mysql> select length(v),length(c) from t10;
    +-----------+-----------+
    | length(v) | length(c) |
    +-----------+-----------+
    |         4 |         2 |
    +-----------+-----------+
    row in set (0.00 sec)
    
    # 给结果拼上一个加号会更清楚
    mysql> select concat(v,'+'),concat(c,'+') from t10;
    +---------------+---------------+
    | concat(v,'+') | concat(c,'+') |
    +---------------+---------------+
    | ab  +         | ab+           |
    +---------------+---------------+
    row in set (0.00 sec)
    
    # 当存储的长度超出定义的长度,会截断
    mysql> insert into t10 values ('abcd  ','abcd  ');
    Query OK, 1 row affected, 1 warning (0.01 sec)
    
    mysql> select * from t10;
    +------+------+
    | v    | c    |
    +------+------+
    | ab   | ab   |
    | abcd | abcd |
    +------+------+
    rows in set (0.00 sec)
    
    

    4.日期类型

    表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。

    每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。

    TIMESTAMP类型有专有的自动更新特性,将在后面描述。

    作用:存储用户注册时间,文章发布时间,员工入职时间,出生时间,过期时间等

    类型 大小 (字节) 范围 格式 用途
    DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 年月日
    TIME 3 '-838:59:59'/'838:59:59' HH:MM:SS 时分秒
    YEAR 1 1901/2155 YYYY 年份值
    DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 年月日时分秒
    TIMESTAMP 4 1970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 YYYYMMDD HHMMSS 混合日期和时间值,时间戳
    日期类型介绍:
        
    YEAR
        YYYY(范围:1901/2155)例:2018
    
        
    DATE
        YYYY-MM-DD(范围:1000-01-01/9999-12-31)例:2018-01-01 
    
        
    TIME
        HH:MM:SS(范围:'-838:59:59'/'838:59:59')例:12:09:32
    
                        
    DATETIME
    
        YYYY-MM-DD HH:MM:SS(范围:1000-01-01 00:00:00/9999-12-31 23:59:59  )例: 2018-01-01 12:09:32
    
                                        
    TIMESTAMP
    
        YYYYMMDD HHMMSS(范围:1970-01-01 00:00:00/2037 年某时)
    
    
    日期类型示例:
        
    
    year:
        mysql> create table t11(born_year year); #无论year指定何种宽度,最后都默认是year(4)
        mysql> insert into t11 values  
            -> (1900),
            -> (1901),
            -> (2155),
            -> (2156);
        mysql> select * from t11;
        +-----------+
        | born_year |
        +-----------+
        |      0000 |
        |      1901 |
        |      2155 |
        |      0000 |
        +-----------+
    
    
    date,time,datetime:
        mysql> create table t12(d date,t time,dt datetime);
        mysql> desc t12;
        +-------+----------+------+-----+---------+-------+
        | Field | Type     | Null | Key | Default | Extra |
        +-------+----------+------+-----+---------+-------+
        | d     | date     | YES  |     | NULL    |       |
        | t     | time     | YES  |     | NULL    |       |
        | dt    | datetime | YES  |     | NULL    |       |
        +-------+----------+------+-----+---------+-------+
    
        mysql> insert into t12 values(now(),now(),now());
        mysql> select * from t12;
        +------------+----------+---------------------+
        | d          | t        | dt                  |
        +------------+----------+---------------------+
        | 2019-08-30 | 16:26:54 | 2019-08-30 16:26:54 |
        +------------+----------+---------------------+
    
    
    
    timestamp:
        mysql> create table t13(time timestamp);
        mysql> insert into t13 values();
        mysql> insert into t13 values(null);
        mysql> select * from t13;
        +---------------------+
        | time                |
        +---------------------+
        | 2019-08-30 16:29:17 |
        | 2019-08-30 16:30:01 |
        +---------------------+
        
        
    #1. 单独插入时间时,需要以字符串的形式,按照对应的格式插入
    #2. 插入年份时,尽量使用4位值
    #3. 插入两位年份时,<=69,以20开头,比如50,结果2050      
    #                >=70,以19开头,比如71,结果1971
    

    5.枚举类型和集合类型

    ENUM中文名称叫枚举类型,它的值范围需要在创建表时通过枚举方式显示。ENUM只允许从值集合中选取单个值,而不能一次取多个值

    SET和ENUM非常相似,也是一个字符串对象,里面可以包含0-64个成员。根据成员的不同,存储上也有所不同。set类型可以允许值集合中任意选择1或多个元素进行组合。对超出范围的内容将不允许注入,而对重复的值将进行自动去重。

    类型 大小 用途
    ENUM 对1-255个成员的枚举需要1个字节存储;对于255-65535个成员,需要2个字节存储;最多允许65535个成员。 单选:选择性别
    SET 1-8个成员的集合,占1个字节9-16个成员的集合,占2个字节17-24个成员的集合,占3个字节25-32个成员的集合,占4个字节33-64个成员的集合,占8个字节 多选:兴趣爱好
    enum和set类型示例:
        
        mysql> create table consumer( 
        -> name varchar(50),
        -> sex enum('male','female'),
        -> level enum('vip1','vip2','vip3','vip4','vip5'), #在指定范围内,多选一
        -> hobby set('play','music','read','study') #在指定范围内,多选多
        -> );
    
        mysql> insert into consumer values  
            -> ('xiaogui','male','vip5','read,study'),
            -> ('taibai','female','vip1','girl');
    
        mysql> select * from consumer;
        +------+--------+-------+------------+
        | name | sex    | level | hobby      |
        +------+--------+-------+------------+
        | xiaogui | male   | vip5  | read,study |
        | taibai | female | vip1  |            |
        +------+--------+-------+------------+
    

    4.SQL模式简单操作

    使用MySQL必须修改为严格模式,即STRICT_TRANS_TABLES
    
    查看当前会话的sql模式:
    mysql>select @@sql_mode;
    
    查看全局的sql模式:
    mysql>select @@global.sql_mode;
    
    永久修改sql模式:
    在mysql的安装目录下找到my.ini或my.cnf文件,使用pycharm或notepad++打开此文件
    
    在[mysqld]下添加
    sql_mode=STRICT_TRANS_TABLES
    然后重启mysql即可
    

    5.完整性约束

      约束条件与数据类型的宽度一样,都是可选参数

      作用:用于保证数据的完整性和一致

    约束条件分类:
    
    PRIMARY KEY (PK)    标识该字段为该表的主键,可以唯一的标识记录
    FOREIGN KEY (FK)    标识该字段为该表的外键
    NOT NULL    标识该字段不能为空
    UNIQUE KEY (UK)    标识该字段的值是唯一的
    AUTO_INCREMENT    标识该字段的值自动增长(整数类型,而且为主键)
    DEFAULT    为该字段设置默认值
    
    UNSIGNED 无符号
    ZEROFILL 使用0填充
    
    完整性约束详细说明:
        
        
    非空约束 not null:
    mysql>create table t1(id int not null);
    
    
    默认值 default:
    mysql>create table t1(id int not null,
                          sex char(5) not null default 'male');
    
    
    唯一约束  unique:
    mysql>create table t1(id int unique,
                         username char(18) unique);
    
    
    主键 primary key:
        一张表只能有一个主键
        主键的约束作用 = 非空 + 唯一
    
    非空+唯一 not null unique:
        如果一张表中没有设置primary key主键,那么第一个设置非空+唯一的字段会被设置为主键
    mysql>create table t1(id int primary key,
                         username char(10) not null unique
                         age tinyint unsigned
                         );
    
    
    自增 auto_increment:
        1.只能操作数字
        2.自带非空属性
        3.只能对unique字段进行设置
        4.不受删除影响
    mysql>create table t1(id int unique auto_increment,
                         name char(12) not null
                         );
    
    外键约束 foreign key:
        建立表关系使用的约束条件,对应外表中的字段至少是unique的,推荐使用主键作为关联字段
    mysql>create table class3(
      id int primary ,
      cname char(12) not null unique,
      start_date date,
      period char(12),
      course char(12),
      teacher char(12)
    );
    
    mysql>create table student3(
      id int primary key auto_increment,
      name char(12) not null,
      gender enum('male','female'),
      cid int,
      foreign key(cid) references class3(id) on delete cascade on update cascade
    );
    
    
    表关系:
        
    多对一 (一对多):
        
    在多的表里面添加一个字段,并给这个字段加foreign key,比如:
    出版社对应书籍是多对一的关系
    1.先创建出版社表  publish表
    2.创建书籍表,外键写法:
    	create table book(
    		id int primary key,
    		name char(10),
    		pid int,
    		foreign key(pid) references publish(id)
    		);
    3.先给出版社插入数据
    
    
    一对一关系
    
    学生表(student)和客户表(customer)
    create table student(
    		id int primary key,
    		name char(10),
    		cid int unique,
    		foreign key(cid) references customer(id)
    		);
    
    
    多对多关系
    
    作者表和书籍表
    需要借助第三张表来完整两者的关系记录
    第三张表最后创建
    create table authortobook(
    		id int primary key,
    		author_id int,
    		book_id int,
    		foreign key(author_id) references author1(id),
    		foreign key(book_id) references book1(id)
    		);
    

    外键约束三种模式

    外键约束有三种约束模式(都是针对父表的约束):
    
    模式一: district 严格约束(默认的 ),父表不能删除或者更新已经被子表数据引用的记录
    
    模式二:cascade 级联模式:父表的操作,对应的子表关联的数据也跟着操作 。
    
    模式三:set null:置空模式,父表操作之后,子表对应的数据(外键字段)也跟着被置空。
    
    通常的一个合理的约束模式是:删除的时候子表置空;更新的时候子表级联。
    
    指定模式的语法:foreign key(外键字段)references 父表(主键字段)on delete 模式 on update 模式;
    
    注意:删除置空的前提条件是 外键字段允许为空,不然外键会创建失败。
    
    外键虽然很强大,能够进行各种约束,但是外键的约束降低了数据的可控性和可拓展性。通常在实际开发时,很少使用外键来约束。
    
  • 相关阅读:
    Flume案例
    推荐算法
    Hive安装
    打开相机
    打电话,发短信
    温度传感器,摇一摇
    经度,纬度,获取
    团队站立会议01
    团队项目计划会议
    "群英队"电梯演讲
  • 原文地址:https://www.cnblogs.com/tutougold/p/11437251.html
Copyright © 2020-2023  润新知