SQL--约束,范式
SQL--约束
( 补充知识链接 )
唯一约束
唯一约束 一个表可以多个字段加 值唯一性
ALTER TABLE tb2 ADD UNIQUE(id);
注:下图为id字段 增加唯一约束,key属性变为unique
非空约束 一个表可以多个字段加 值不能为空
ALTER TABLE tb2 MODIFY pwd VARCHAR(20) NOT NULL;
注:下图为pwd字段 增加非空约束,null属性变为not null
主键约束 一个表只有一个字段可以加 值不能为空 值必须唯一性
添加主键约束
ALTER TABLE tb2 ADD PRIMARY KEY(id);
# 删除 主键约束
ALTER TABLE tb2 DROP PRIMARY KEY;
另:一个字段(name) + not null + unique 当作主键约束,但无法删除主键约束,
如下图
注:下图为id字段 增加唯一约束,key属性变为unique
自增约束 数据类型 数值类型 一般配合主键约束使用
ALTER TABLE tb2 CHANGE id id int AUTO_INCREMENT;
默认约束 一个表可以多个字段加 没有给值的时候 使用默认值
ALTER TABLE tb2 ALTER sex SET DEFAULT "保密";
SQL--完整表
CREATE TABLE tb3 (
id int PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) UNIQUE KEY,
email VARCHAR(20) NOT NULL,
sex VARCHAR(20) DEFAULT "保密",
pwd VARCHAR(20) NOT NULL
)AUTO_INCREMENT=100,CHARSET=UTF8;
# 外键约束
1.学院表 (表头或字段)
CREATE TABLE `department` (
did INT PRIMARY KEY AUTO_INCREMENT,
dname VARCHAR(20) UNIQUE KEY
)AUTO_INCREMENT=101,CHARSET=UTF8;
2.学生表 (关联学院表 多对一)(表头或字段)
CREATE TABLE `students` (
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(20) NOT NULL,
depid INT,
CONSTRAINT `depart_student_key` FOREIGN KEY (depid)
REFERENCES `department` (did) ON DELETE SET NULL
);
(CONSTRAINT `depart_student_key` 可以省略不写,则自动生成)
(???CONSTRAINT `depart_student_key` 显示在哪里暂不知道)
INSERT INTO `department` (dname) VALUES (增添数据)
("清华大学"),("上海交通大学"),("浙江大学"),("南京大学")
INSERT INTO `students` (sname,deptid) VALUES
("张三",101),("李四",102),("王五",103),("赵六",101),("孙琪",102),
("小花",103),("小红",104)
3 学生档案表(关联学院表 一对一)
CREATE TABLE `studetail` (
stuid INT PRIMARY KEY AUTO_INCREMENT,
stusex VARCHAR(20) NOT NULL,
stuage INT,
stutel VARCHAR(20) NOT NULL,
ssid INT,
FOREIGN KEY (ssid) REFERENCES `students` (sid) ON DELETE CASCADE
)AUTO_INCREMENT=202401,CHARSET=UTF8;
(CASCADE:小暴布,一联串)
INSERT INTO studetail (stusex,stuage,stutel,ssid) VALUES
("男",18,"15326235224",1),("男",19,"15326235223",2),("男",17,"15326235229",3),
("男",18,"15326235220",4),("女",18,"15326235226",5),("女",18,"15326235221",6),
("女",18,"15326235228",7)
4 课程表(多对多)
CREATE TABLE `course` (
cid INT PRIMARY KEY AUTO_INCREMENT,
cname VARCHAR(20) NOT NULL
)AUTO_INCREMENT=1001,CHARSET=UTF8;
5 中间表
CREATE TABLE `stu——course` (
c_id INT,
s_id INT,
PRIMARY KEY(c_id,s_id),
FOREIGN KEY (c_id) REFERENCES `course` (cid),
FOREIGN KEY (s_id) REFERENCES `students` (sid)
);
范式
范式 规则 设计表
(知识补充链接)
第一范式: 要求任何一张表必须有主键
每一个字段原子性不可再分
"""
(本例中,联系方式不能一个字段有两个,必须分开)
学生编号 学生姓名 联系方式
1001 张三 zs@126.com ,13345212411
1002 李四 ls@126.com ,15424562321
"""
第二范式:在第一范式的基础上,要求所有非主键字段必须完全依赖主键
不要产生部分依赖
"""
(本例中,满足第一范式,不满足第二范式(数据冗余),多对多应建三张表,其中一张是中间表)
学生编号 学生姓名 教师编号 教师姓名
1001 张三 101 李老师
1002 李四 102 王老师
1003 王五 101 李老师
1001 张三 102 王老师
"""
"""
学生编号+教师编号 教师姓名 学生姓名
1001101 李老师 张三
1002102 王老师 李四
1003101 李老师 王五
1001102 王老师 张三
"""
第三范式:在第二范式的基础上,要求所有非主键字段必须直接依赖主键
不要产生传递依赖(非必须)
"""
学生编号 学生姓名 班级编号 班级名称
1001 张三 1 一年一班
1002 李四 2 一年二班
1003 王五 3 一年三班
1004 赵六 4 一年四班
"""
CREATE TABLE tb2
(
id INT,
name VARCHAR(20),
email VARCHAR(255),
pwd VARCHAR(20),
sex VARCHAR(20)
);