constraint 约束数据(对表中数据的限制条件)
四种条件约束:非空 唯一性 主键约束 外键约束
非空约束(not null)约束的字段不能为空值,必须赋具体的数据
CREATE TABLE t_user (
id INT (4),
NAME VARCHAR(32) NOT NULL,
class BIGINT(1000)
);
这里的ID不可以是空值
唯一性约束(unique)约束的字段具有唯一性,不可重复
列级约束
CREATE TABLE t_user (
id INT (4)unique,
NAME VARCHAR(32) ,
class BIGINT(1000)
);
表级约束(多个字段联合进行约束)
CREATE TABLE t_user (
id INT (4),
NAME VARCHAR(32) ,
class BIGINT(1000)
unique(id,name)
//多个字段的联合唯一性约束 constraint 表名 _ 字段名 _约束字段名
);
非空性约束与联合性唯一约束的联合应用(既不能重复且唯一使用)
CREATE TABLE t_stu(
NO INT (4) NOT NULL UNIQUE
NAME VARCHAR(128)
);
主键约束
primary ky(pk)
主键约束 主键字段 主键值
表中某个字段被添加主键约束后,该字段被称为主键字段,主键字段中出现的每一个数据都称为主键值
主见约束的作用;
添加主见约束的字段既不能为空,也不能重复。。。。效果与not null unique 相同,但是默认添加了一个"索引 -----index"(
提高了检索效率)
一张表应该有主键,主键的值不能修改,及时两个数据完全相同但是他们的主键值不同,也认为他们是不同索引
根据个数分类,单一主键和复合主键
列级写法
CREATE TABLE t_stu(
NO INT (4) PRIMARY KEY
NAME VARCHAR(32) NOT NULL
);
表级写法
CREATE TABLE t_stu(
NO INT (4),
NAME VARCHAR(32) NOT NULL
PRIMARY KEY(id)
);
对于复合主键,只要有一个字段值不同就认为不符合
2.根据业务逻辑分为:自然主键和业务主键
自然主键:若是一个自然数,则这个自然数和业务没有任何关系
业务主键:主键值和当前的业务紧密相关,
mysql自动生成主键值AUTO_INCREMENT
mysql提供一个自增数字auto_increment,默认从1开始自增。
CREATE TABLE t_students(
id INT (4) PRIMARY KEYAUTO_INCREMENT,
NAME VARCHAR(32) NOT NULL
);
外键约束(foreign key)(外键在同一个表中可以有多个)
外键约束,外键字段,外键值:
单一外键:给一个字段添加外键约束
DROP TABLE IF exits t_class;
CREATE TABLE t_class (
cno INT(4) PRIMARY KEY,
cname VARCHAR(32)
);
DROP TABLE IF exits t_stdent;
CREATE TABLE t_student(
sno INT(4)PRIMARY KEY AUTO_INCREMENT,
sname INT (4),
classno INT(4),
CONSTRAINT t_stdent_class_fk FOREIGN KEY(classno) REFERENCES t_class(cno)
);
首先避免了数据冗余,其次添加了外键约束
以上的表中产生了父子关系,先有父的数据,才有子 ,创建表时应该先创建父表数据再创建字表数据。
外键字段可以为null,外键为空的数据称为孤儿数据
被应用字段必须具有唯一性约束,
外键约束应该注意:
分成两张表来存储,可以减少数据的冗余
典型的一对多的关系,在多的一方要添加外键
SELECT
s.sname,c,cname
FROM
t_student
JOIN
t_class
ON
s.cno = c.classno;
查询学生做对应的班级名称。
级联更新与级联删除(在外键约束的基础之上来使用)
在外键约束后面添加关键字(谨慎使用)
级联删除:
alter table t_student add constraint t_student_classno_fk foreign key(classno) reference t_class(cno);
级联更新:
alter table t_student add constraint t_student_classno_fk foreign key(classno) reference t_class(cno) on update cascade;(及时更新与之相关的数据)
复合外键:给多个字段添加外键约束