数据库操作(一)

数据库操作(一)

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 模式;

注意:删除置空的前提条件是 外键字段允许为空,不然外键会创建失败。

外键虽然很强大,能够进行各种约束,但是外键的约束降低了数据的可控性和可拓展性。通常在实际开发时,很少使用外键来约束。
原文地址:https://www.cnblogs.com/tutougold/p/11437251.html