诸城公司做网站石家庄搜索引擎优化
文章目录
- 约束(constraint)
 - 列级约束和表级约束
 - 给约束起名字(constraint)
 - 非空约束(no null)
 - 检查约束(check)
 - 唯一性约束 (unique)
 - 主键约束 (primary key)
 - 主键分类
 - 单一主键
 - 复合主键
 - 主键自增 (auto_increment)
 
- 外键约束
 - 外什么用外键
 - 级联删除
 - 级联更新
 - 级联置空
 - 注意点
 
约束(constraint)
列级约束和表级约束
列级约束
直接在字段后面是列级约束
create table test (id int 约束1 约束2.....,name varchar(20) 约束1 约束2....
);
 
表级约束
定义完,再约束是表记约束。比如联合不能重复的时候就要用到
create table test (id int,name varchar(20),//这里表示 id 和 name联合不能重复 unique(id, name)
);
 
给约束起名字(constraint)
create table test (id int,name varchar(20),//这里给 unique 起别名,方便删除 constraint 别名 unique(id, name)
);
 
约束的描述信息,在information_schema 库中的 table_constraints表中
非空约束(no null)
create table test (id int.name varchar(255) not nul;
);
//表示 name 字段不能为空
 
检查约束(check)
create table test (id int,name varchar(255),age int check(age > 18)
);
//表示 age 必须 大于 18
 
唯一性约束 (unique)
create table test(no int,name varchar(100),email varchar(100), unique(name, email)
);
//把 email 和 name 设置成联合唯一性的,不能插入重复的,除了NULL
 
主键约束 (primary key)
- 主键约束的字段不能为NULL,并且不能重复。
 
- 任何一张表都应该有主键,没有主键的表可以视为无效表。
 
- 主键值是这行记录的唯一标识。在数据库表中即使两条数据一模一样,但由于主键值不同,我们也会认为是两条完全的不同的数据。
 
主键分类
- 根据字段数量分类:
 
- 单一主键(1个字段作为主键)【建议】
 - 复合主键(2个或2个以上的字段作为主键)
 - 根据业务分类:
 
- 自然主键(主键和任何业务都无关,只是一个单纯的自然数据)【建议】
 - 业务主键(主键和业务挂钩,例如:银行卡账号作为主键)
 
单一主键
create table test (uid int primary key,nno varchar(100) unique,name varchar(100) not null
)
//把 uid 设置为主键
 
复合主键
create table test (uid int,nno varchar(100) unique,name varchar(100) not null,primary key(uid, nno)
)
//把 uid 和 nno 设置成联合主键
 
不建议使用
主键自增 (auto_increment)
主键自增:既然主键值是一个自然的数字,mysql为主键值提供了一种自增机制,不需要我们程序员维护,mysql自动维护该字段create table test (no int primary key auto_increment,name varchar(20)
);
 
外键约束
create table t_school( sno int primary key, sname varchar(255) 
); create table t_student( no int primary key, name varchar(255), age int, sno int, //constraint 是起别名,foreign key...references 是外键constraint t_school_sno_fk foreign key(sno) references t_school(sno) 
);
//外键不一定是主键,也可以是父表中具有唯一性的字段
 
外什么用外键

 图片来源:动力节点
这种情况比较浪费空间直接两张表,然后设置外键
表一

 图片来源:动力节点
表二

 图片来源:动力节点
级联删除
创建子表时,外键可以添加:on delete cascade,这样在删除父表数据时,子表会级联删除。谨慎使用。create table t_student( no int primary key, name varchar(255), age int, sno int, constraint t_school_sno_fk foreign key(sno) references t_school(sno) on delete cascade 
);
 
###删除约束
alert table t_student drop foreign key t_student_sno_fk;
###添加约束
alert table t_student add constraint t_student_sno_fk foreign key(sno) references t_school(sno) on delete cascade; 
 
级联更新
创建子表时,外键可以添加:on update cascade ,这样在修改父表数据时,子表会级联修改,谨慎使用。create table t_student( no int primary key, name varchar(255), age int, sno int, constraint t_school_sno_fk foreign key(sno) references t_school(sno) on update cascade 
);
 
级联置空
创建子表时,外键可以添加:on delete set null,父数据设置成 null ,子表会级联设置为 null ,谨慎使用。create table t_student( no int primary key, name varchar(255), age int, sno int, constraint t_school_sno_fk foreign key(sno) references t_school(sno) on delete set null 
);
 
注意点
- 添加了外键约束的字段中的数据必须来自其他字段,不能随便填。
 
- 假设给a字段添加了外键约束,要求a字段中的数据必须来自b字段,b字段不一定是主键,但至少要有唯一性。
 
- 外键约束可以给单个字段添加,叫做单一外键。也可以给多个字段联合添加,叫做复合外键。复合外键很少用。
 
a 表 如果引用 b 表 中的数据,可以把 b表 叫做 父表 ,把 a 表 叫做 子表。
- 创建表时,先创建父表,再创建子表。
 - 插入数据时,先插入父表,在插入子表。
 - 删除数据时,先删除子表,再删除父表。
 - 删除表时,先删除子表,再删除父表。
 插入就先父,删除先子
