MySQL004:MySQL中的六种约束

约束:保证数据的完整性,保证数据的有效性。
一,主键约束:primary key
加了主键的列不能重复,并且不能为null(不知道),每一张表必须在只能有一个主键。
主键一般加在标志列上,代表唯一性
如果加数据的时候,出现主键列重复,则程序会报错。

CREATE TABLE TT(
     tid INT PRIMARY KEY,  //主键约束
     tname VARCHAR(20)
     )

复合主键:将一个主键作用在多个列上

CREATE TABLE TT1(
     tid INT,
     tname VARCHAR(20),
     PRIMARY KEY(tid,tname)  //复合主键
     )

此时,指代的含义是tid和tname的组合不能出现重复
在这里插入图片描述
二,默认约束给出默认值,如果写入数据的时候没有写此项,则保持默认值。
在你给该列不添加值的情况下自动走默认值

DEFAULT '北大街'

注意:理论上在加名字的时候写上null是可以自己加默认值的,但是我操作的时候没有,加上default(默认值)就可以自己加上默认值了。

CREATE TABLE student1(
     sid INT,
     sname VARCHAR(20) DEFAULT'张三'
     )
     INSERT INTO student1 VALUES(1,DEFAULT),(2,'李四')
     INSERT INTO student1(sid,sname) VALUES(3,'王五'),(4,DEFAULT)
     SELECT * FROM student1

在这里插入图片描述
三,自增长(auto_increment)约束
每次在最大值的基础上加1,如果后面加一个更大的数,她会在更大的数值上加一。
它默认是从1开始加的
注意点:自增长暂时只能添加到主键列上,(原因是主键列自带索引)并且必须加在数字列上

CREATE TABLE student2(
     sid INT PRIMARY KEY AUTO_INCREMENT,
     sname VARCHAR(20) DEFAULT'张三'
     )
     INSERT INTO student2 VALUES(NULL,DEFAULT),(NULL,'李四')
     INSERT INTO student2(sid,sname) VALUES(8,'王五'),(NULL,DEFAULT)
     SELECT * FROM student2

在这里插入图片描述
我们自己也可以定义起始值,在创建表的时候在表末尾添加

AUTO_INCREMENT=999

还可以追加默认值

ALTER TABLE student3 AUTO_INCREMENT=1001

在这里插入图片描述

Truncate table 表名
Delete from 表名
这俩都是删除表里面的数据,但是Truncate先把表删了之后再创建新表(所以它慢),Delete是直接删除表数据,所以你看到的自增长前者是重新从1开始,后者接着最大值开始

四,唯一性约束(unique,也是自带索引),可以有多个null
注意:多个null可以重复,其他数据是不能重复的

CREATE TABLE student5(
     sid INT UNIQUE,
     sname VARCHAR(20) UNIQUE
     )
     INSERT INTO student5 VALUES(1,'张三'),(2,'李四')
     INSERT INTO student5(sid,sname) VALUES(4,'王五'),(3,'赵六')

唯一性约束和主键约束的区别
1:主键不能为null,唯一性约束可以
2:主键只有一个,唯一性约束可以加在多个列上

扫描二维码关注公众号,回复: 6242940 查看本文章

五,Not null 约束
强制列不能为 NULL 值,约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。

CREATE TABLE student6(
     sid INT UNIQUE,
     sname VARCHAR(20) NOT NULL
     )
     INSERT INTO student6 VALUES(1,NULL),(2,'李四')
     INSERT INTO student6(sid,sname) VALUES(4,'王五'),(3,'赵六')

非严格模式下可以进去,但是进去不显示null

在这里插入图片描述
六,外键约束(重点)
实体:一个一个实实在在的物体就是实体
实体和实体的三种关系:
1,一对一:
就像一个学号对应一个学生一样,一对一用一张表存数据就够了。
在这里插入图片描述
2,一对多:就像一个锁对应多把钥匙,要用两张表来表示,明明可以用一张表表示,为什么要用两张?原因是要要降低冗余。(降低冗余,就是一张表中只能有一个序列号作为主键,且不重复,主键所在的表作为主表,另一个就是从表。)
数据库的冗余不能消除,只能降到最低
比如做一个qq留言表。
一个人可以留言多句话,但是留言只有三条,第一条是1号刘能能流的,第二条是2号张无忌流的,第三条也是2号张无忌流的
在这里插入图片描述
所以我们需要降低冗余
在这里插入图片描述
完成该表,需要引用上表。
在这里插入图片描述

3,多对多:需要用三张表
一个学生可以选修多门课,一门课可以被多个学生选修
多个学生选修课程表
在这里插入图片描述
学生表:
在这里插入图片描述
课程表
在这里插入图片描述
关系表:需要用到符合主键,就是他们的组合不能重复
在这里插入图片描述
外键:一个表中的字段引用自另一张表里面的主键,那么该字段就是外键
外面约束必须在innodb引擎下才有效
引擎:数据库存储和处理数据的核心服务

外键约束的要求:
1,父表和子表必须使用相同的存储引擎,而且禁止使用临时表。(父表:子表所参照的表子表:具有外键列的表)
2,数据表的存储引擎只能为InnoDB。
3.外键列和参照列必须具有相似的数据类型。其中数字的长度或是否有符号位必须相同;而字符的长度则可以不同。( 外键列:曾经加过FOREIGN KEYp的列,参照列:外键列所参照的列称为参照列)
4,外键列和参展列必须创建索引。如果外键列不存在索引的话,mysql将自动创建索引 。( 如果参照列不存在索引的话,mysql不会自动创建索引。但如果参照列为主键的话,则会自动创建索引。主键在创建的同时会自动创建索引,所以参照列其实已经有了索引。而外键列上没有创建索引,mysql则会自动创建索引。)

猜你喜欢

转载自blog.csdn.net/weixin_44699728/article/details/90183704