第六章 数据库约束
对表中的数据进行进一步的限制,保证数据的正确性、有效性和完整性。 约束种类:
PRIMARY KEY: 主键
UNIQUE: 唯一
NOT NULL: 非空
DEFAULT: 默认
FOREIGN KEY: 外键
6.1 主键
6.1.1 主键作用
用来唯一标识一条记录,每个表都应该有一个主键,并且每个表只能有一个主键。 有些记录的 name,age,score 字段的值都一样时,那么就没法区分这些数据,造成数据库的记录不唯一,这样就不方便管理数据 哪个字段应该作为表的主键? 通常不用业务字段作为主键,单独给每张表设计一个id的字段,把id作为主键。主键是给数据库和程序使用的,不是给最终的客户使用的。所以主键有没有含义没有关系,只要不重复,非空就行。
6.1.2 创建主键
主键:PRIMARY KEY 主键的特点:
主键必须包含唯一的值
主键列不能包含NULL值
创建主键方式:
1. 在创建表的时候给字段添加主键
字段名 字段类型 PRIMARY KEY
2. 在已有表中添加主键 ALTER TABLE 表名 ADD PRIMARY KEY(字段名);
具体操作:创建表学生表st5, 包含字段(id, name, age)将id做为主键
CREATE TABLE st5 ( id INT PRIMARY KEY, ‐‐ id是主键 NAME VARCHAR(20), age INT );
添加数据
INSERT INTO st5 (id, NAME) VALUES (1, '唐伯虎'); INSERT INTO st5 (id, NAME) VALUES (2, '周文宾'); INSERT INTO st5 (id, NAME) VALUES (3, '祝枝山'); INSERT INTO st5 (id, NAME) VALUES (4, '文征明');
插入重复的主键值
///
主键是唯一的不能重复: Duplicate entry '1' for key 'PRIMARY'INSERT INTO st5 (id, NAME) VALUES (1, '文征明2');
插入NULL的主键值
主键是不能为空的: Column 'id' cannot be nullINSERT INTO st5 (id, NAME) VALUES (NULL, '文征明3')
//
注意 : 一张表中只有一个主键 , 主键可以为多个字段 , 不过我们一般增减一个字段 id 来作为主键.
6.1.3 删除主键
ALTER TABLE 表名 DROP PRIMARY KEY;
具体操作:删除st5表的主键
ALTER TABLE st5 DROP PRIMARY KEY;
6.1.4 主键自增
主键如果让我们自己添加很有可能重复,我们通常希望在每次插入新记录时,数据库自动生成主键字段的值AUTO_INCREMENT 表示自动增长(字段类型是整型数字)
具体操作:创建学生表st6, 包含字段(id, name, age)将id做为主键并自动增长
/
CREATE TABLE st6 ( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20), age INT );
插入数据
主键默认从1开始自动增长
INSERT INTO st6 (NAME, age) VALUES ('唐僧', 22); INSERT INTO st6 (NAME, age) VALUES ('孙悟空', 26); INSERT INTO st6 (NAME, age) VALUES ('猪八戒', 25); INSERT INTO st6 (NAME, age) VALUES ('沙僧', 20);
DELETE和TRUNCATE的区别
DELETE 删除表中的数据,但不重置AUTO_INCREMENT的值。
TRUNCATE 摧毁表,重建表,AUTO_INCREMENT重置为1
TRUNCATE 摧毁表,重建表,AUTO_INCREMENT重置为1
6.2 唯一
在这张表中这个字段的值不能重复
6.2.1唯一约束
字段名 字段类型 UNIQUE
6.2.2 实现唯一约束
具体步骤:创建学生表st7, 包含字段(id, name),name这一列设置唯一约束,不能出现同名的学生
CREATE TABLE st7 ( id INT, NAME VARCHAR(20) UNIQUE );
添加一个学生
INSERT INTO st7 VALUES (1, '貂蝉'); INSERT INTO st7 VALUES (2, '西施'); INSERT INTO st7 VALUES (3, '王昭君'); INSERT INTO st7 VALUES (4, '杨玉环');
/
‐‐ 插入相同的名字出现name重复: Duplicate entry '貂蝉' for key 'name'
INSERT INTO st7 VALUES (5, '貂蝉'); ‐‐ 出现多个null的时候会怎样?因为null是没有值,所以不存在重复的问题
INSERT INTO st3 VALUES (5, NULL);INSERT INTO st3 VALUES (6, NULL);
6.3 非空
这个字段必须设置值,不能是NULL
6.3.1 非空约束的基本语法格式
字段名 字段类型 NOT NULL
具体操作:创建表学生表st8, 包含字段(id,name,gender)其中name不能为NULL
/
CREATE TABLE st8 ( id INT, NAME VARCHAR(20) NOT NULL, gender CHAR(2) );
添加一条完整的记录
INSERT INTO st8 VALUES (1, '郭富城', '男'); INSERT INTO st8 VALUES (2, '黎明', '男'); INSERT INTO st8 VALUES (3, '张学友', '男'); INSERT INTO st8 VALUES (4, '刘德华', '男'); ‐‐ 姓名不赋值出现姓名不能为null: Column 'name' cannot be null INSERT INTO st8 VALUES (5, NULL, '男');
6.3.2 默认值
往表中添加数据时,如果不指定这个字段的数据,就使用默认值默认值格式 字段名 字段类型 DEFAULT 默认值
具体步骤:创建一个学生表 st9,包含字段(id,name,address), 地址默认值是广州
CREATE TABLE st9 ( id INT, NAME VARCHAR(20), address VARCHAR(50) DEFAULT '广州' )
添加一条记录,使用默认地址
INSERT INTO st9 (id, NAME) VALUES (1, '刘德华');
添加一条记录,不使用默认地址
INSERT INTO st9 VALUES (2, '张学友', '香港');
第七章 表关系
7.1 表关系概念图
现实生活中,实体与实体之间肯定是有关系的,比如:老公和老婆,部门和员工,老师和学生等。那么我们在设计表的时候,就应该体现出表与表之间的这种关系!分成三种:
1. 一对一
2. 一对多
3. 多对多
7.2 一对多
对多(1:n) 例如:班级和学生,部门和员工,客户和订单,分类和商品 一对多建表原则: 在从表(多方)创建一个字段,指向主表(一方)的主键.我们把这个字段称之为外键.
7.3 多对多
多对多(m:n) 例如:老师和学生,学生和课程,用户和角色 多对多关系建表原则: 需要创建第三张表,中间表中至少两个字段,这两个字段分别作为外键指向各自一方的主键。
7.4 一对(了解)
对一(1:1) 在实际的开发中应用不多.因为一对一可以创建成一张表。 两种建表原则:
外键唯一:主表的主键和从表的外键(唯一),形成主外键关系,
外键唯一UNIQUE外键是主键:主表的主键和从表的主键,形成主外键关系
7.5 外键约束
7.5.1 什么是外键约束
一张表中的某个字段引用另一个表的主键 主表: 约束别人 副表/从表: 使用别人的数据,被别人约束
7.5.2 创建外键
1. 新建表时增加外键: [CONSTRAINT] [外键约束名称] FOREIGN KEY(外键字段名) REFERENCES 主表名(主键字段名)
关键字解释:
CONSTRAINT -- 约束关键字
FOREIGN KEY(外键字段名) –- 某个字段作为外键
REFERENCES -- 主表名(主键字段名) 表示参照主表中的某个字段
2.已有表增加外键: ALTER TABLE 从表 ADD [CONSTRAINT] [外键约束名称] FOREIGN KEY (外键字段名) REFERENCES 主表(主键字段名);
具体操作:以"新建表时添加外键"演示
‐ 先创建部门表 CREATE TABLE department ( id INT PRIMARY KEY AUTO_INCREMENT, dep_name VARCHAR(20), dep_location VARCHAR(20) ); ‐‐ 添加2个部门 INSERT INTO department (dep_name, dep_location) VALUES ('研发部', '广州'), ('销售部', '深圳'); ‐‐ 然后创建员工表,添加外键约束 CREATE TABLE employee ( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20), age INT, dep_id INT, ‐‐ 添加一个外键 ‐‐ 外键取名公司要求,一般fk结尾 CONSTRAINT emp_depid_ref_dep_id_fk FOREIGN KEY(dep_id) REFERENCES department(id) );
正常添加数据
INSERT INTO employee (NAME, age, dep_id) VALUES('张三', 20, 1),('李四', 21, 1),('王五', 20, 1),('老王', 20, 2),('大王', 22, 2),('小王', 18, 2);
部门错误的数据添加失败
INSERT INTO employee (NAME, age, dep_id) VALUES ('二王', 20, 5);
7.5.3 删除外键(了解)
ALTER TABLE 从表 drop foreign key 外键名称;
具体操作:删除employee表的emp_depid_ref_dep_id_fk外键
ALTER TABLE employee DROP FOREIGN KEY emp_depid_ref_dep_id_fk;
在employee表情存在况下添加外键
ALTER TABLE employee ADD CONSTRAINT emp_depid_ref_dep_id_fk FOREIGN KEY(dep_id) REFERENCES department(id);