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:主键只有一个,唯一性约束可以加在多个列上
五,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则会自动创建索引。)
给一个从表添加外键
ALTER TABLE film ADD CONSTRAINT fk_student_cid FOREIGN KEY(t_id) REFERENCES film_type(t_id)
这句话的意思是:给film从表添加一个名字为fk_student_cid的外键,位置是film下的t_id代表film_type下的t_id。
级联删除:
外键后面加上
ON DELETE CASCADE
级联更新:
外键后面加上
ON UPDATE CASCADE
级联修改为空:
外键后面加上
ON update set null
级联删除为空:
外键后面加上
ON DELETE SET NULL