
对表中的数据进行限定,保证数据的正确性、有效性和完整性。
分类:
①、主键约束:primary key
②、非空约束:not null
③、唯一约束:unique
④、外键约束:foreign key
一、非空约束:not null,某一列的值不能为null
创建表时添加约束
CREATE TABLE stu(
id INT,
NAME VARCHAR(20) NOT NULL -- name为非空
);
1
2
3
4
1
2
3
4
创建表完后,添加非空约束
CREATE TABLE stu(
id INT,
NAME VARCHAR(20)
);
ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;
1
2
3
4
5
6
1
2
3
4
5
6
在这里插入描述
删除name的非空约束
ALTER TABLE stu MODIFY NAME VARCHAR(20);
1
1
在这里插入描述
二、唯一约束:unique,某一列的值不能重复
注意:唯一约束可以有NULL值,但是只能有一条记录为null
在创建表时,添加唯一约束
CREATE TABLE stu(
id INT,
phone_number VARCHAR(20) UNIQUE -- 手机号
);
1
2
3
4
1
2
3
4
在这里插入描述
删除唯一约束
ALTER TABLE stu DROP INDEX phone_number;
1
1
在这里插入描述
在表创建完后,添加唯一约束
ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE;
1
1
三、主键约束:primary key。
注意:
①、含义:非空且唯一
②、一张表只能有一个字段为主键
③、主键就是表中记录的唯一标识
在创建表时,添加主键约束
create table stu(
id int primary key,-- 给id添加主键约束
name varchar(20)
);
1
2
3
4
1
2
3
4
在这里插入描述
删除主键
-- 错误 alter table stu modify id int ;
ALTER TABLE stu DROP PRIMARY KEY;
1
2
1
2
在这里插入描述
创建完表后,添加主键
create table stu(
id int,
name varchar(20)
);
ALTER TABLE stu MODIFY id INT PRIMARY KEY;
1
2
3
4
5
6
1
2
3
4
5
6
自动增长:
①、概念:如果某一列是数值类型的,使用 auto_increment 可以来完成值得自动增长
②、在创建表时,添加主键约束,并且完成主键自增长
create table stu(
id int primary key auto_increment,-- 给id添加主键约束
name varchar(20)
);
1
2
3
4
1
2
3
4
在这里插入描述
③、 删除自动增长
ALTER TABLE stu MODIFY id INT;
1
1
在这里插入描述
④、添加自动增长
ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;
1
1
四、外键约束:foreign key,让表于表产生关系,从而保证数据的正确性。
CREATE TABLE emp(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(30),
age INT,
dep_name VARCHAR(30),
dep_location VARCHAR(30)
);
INSERT INTO emp VALUES (1, '张三', 20, '研发部', '广州');
INSERT INTO emp VALUES (2, '李四', 21, '研发部', '广州');
INSERT INTO emp VALUES (3, '王五', 20, '研发部', '广州');
INSERT INTO emp VALUES (4, '老王', 20, '销售部', '深圳');
INSERT INTO emp VALUES (5, '大王', 22, '销售部', '深圳');
INSERT INTO emp VALUES (6, '小王', 18, '销售部', '深圳');
1
2
3
4
5
6
7
8
9
10
11
12
13
14
1
2
3
4
5
6
7
8
9
10
11
12
13
14
在这里插入描述
通过上面的表格,我们可以知道,表中的信息是员工在不同的部门里面,于是我们可以将上面的一张表分开,分成两张表格。一张部门的表,一张员工的表。
-- 创建部门表(id,dep_name,dep_location)
CREATE TABLE department(
id INT PRIMARY KEY AUTO_INCREMENT,
dep_name VARCHAR(20),
dep_location VARCHAR(20)
);
-- 创建员工表(id,name,age,dep_id)
CREATE TABLE employee(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
age INT,
dep_id INT -- 外键对应主表的主键
);
-- 添加两个部门
INSERT INTO department VALUES(NULL, '研发部','广州'),(NULL ,'销售部', '深圳');
-- 添加员工信息
INSERT INTO employee (NAME,age,dep_id) VALUES('张三',20,1);
INSERT INTO employee (NAME,age,dep_id) VALUES('李四',21,1);
INSERT INTO employee (NAME,age,dep_id) VALUES('王五',20,1);
INSERT INTO employee (NAME,age,dep_id) VALUES('老王',20,2);
INSERT INTO employee (NAME,age,dep_id) VALUES('大王',22,2);
INSERT INTO employee (NAME,age,dep_id) VALUES('小王',18,2);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
在这里插入描述
倘若现在我们把删除department表里面的数据,是可以删除的;但是这不符合实际情况。因为我们此时虽然删除掉了deparment表里的数据,但是employee表里面还是存在部门的信息。只有当部门里面的员工全部开除后,我们才可以删除部门表。
1添加外键
在创建表时,可以添加外键:
create table 表名(
外键列
constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称)
);
1
2
3
4
5
1
2
3
4
5
-- 创建员工表(id,name,age,dep_id)
CREATE TABLE employee(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
age INT,
dep_id INT, -- 外键对应主表的主键
CONSTRAINT emp_dept_fk FOREIGN KEY (dep_id) REFERENCES department(id)
);
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
删除外键
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
1
1
创建表之后,添加外键
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);
1
1
2 级联 *** 作
我们如果要是直接在deparment表中直接将id=1修改为id=5的话,是不可以的。因为department的id被关联到employee表中了,所以修改会产生错误。;但是我们可以通过级联 *** 作进行修改。
添加级联 *** 作
语法:
ALTER TABLE 表名 ADD CONSTRAINT 外键名称
FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称)
ON UPDATE CASCADE ON DELETE CASCADE;
1
2
3
1
2
3
分类:
①、级联更新:ON UPDATE CASCADE
②、级联删除:ON DELETE CASCADE
示例演示:
①、删除外键employee表中的外键(因为此时表中已经添加外键,需要先删除)
-- 删除外键
ALTER TABLE employee DROP FOREIGN KEY emp_dept_fk;
1
2
1
2
②、添加外键的同时,还要添加级联 *** 作
ALTER TABLE employee ADD CONSTRAINT emp_dept_fk FOREIGN KEY ( dep_id ) REFERENCES department ( id ) ON UPDATE CASCADE ON DELETE CASCADE;
1
1
③、倘若我们现在要是删除employee表中id=1的数据,那么department表中的数据也会跟着一起更新数据。
delete from department where id=1;
1
1
-- 查询department表数据
select from department;
1
2
1
2
在这里插入描述
-- 查询employee表数据
select from employee;
1
2
1
2
在这里插入描述
一.数据表和字段的设计
表设计原则
标准化和规范化
数据的标准化有助于消除数据库中的数据冗余 标准化有好几种形式 我们在这里采用Third Normal Form( NF) 因为 NF在性能 扩展性和数据完整性方面达到了最好平衡 遵守 NF 标准的数据库某个表只包括其本身基本的属性 当不是它们本身所具有的属性时需进行分解 表之间的关系通过外键相连接 它具有以下特点 有一组表专门存放通过键连接起来的关联数据
考虑各种变化
在设计数据库的时候考虑到哪些数据字段将来可能会发生变更
字段设计原则 ) 每个表中都应该添加的 个有用的字段 即要求每张数据表中字段不得少于 个 ) 选择数字类型和文本类型尽量充足 在字段类型为数字或文本时 其长度最好比实际所需的大一些 ) 增加自动增长的 *** 作ID字段(czid) ) 增加记录创建的日期字段(CreateDate) ) 增加删除标记字段(isvoid) 在表中包含一个 删除标记 字段 这样就可以把行标记为删除 在关系数据库里不单独删除某一行 一般采用清除数据程序而且要仔细维护索引整体性
二.键和索引的设计
键选择原则
)为关联字段创建外键 )所有的键都必须唯一 )避免使用复合键 )外键总是关联唯一的键字段
使用系统生成的主键设计数据库的时候采用系统生成的键作为主键 那么实际控制了数据库的索引完整性 这样 数据库和非人工机制就有效地控制了对存储数据中每一行的访问 采用系统生成键作为主键还有一个优点 当拥有一致的键结构时 找到逻辑缺陷很容易 不要用用户的键(不让主键具有可更新性)在确定采用什么字段作为表的键的时候 小心用户将要编辑的字段 通常的情况下不要选择用户可编辑的字段作为键
可选键有时可做主键把可选键进一步用做主键 可以拥有建立强大索引的能力
索引使用原则
索引是从数据库中获取数据的最高效方式之一 %的数据库性能问题都可以采用索引技术得到解决
索引外键大多数数据库都索引自动创建的主键字段 但是可别忘了索引外键 它们也是经常使用的键 比如运行查询显示主表和所有关联表的某条记录就用得上 不要索引大型字段(有很多字符) 这样作会让索引占用太多的存储空间
不要索引常用的小型表不要为小型数据表设置任何键 假如它们经常有插入和删除 *** 作就更别这样作了 对这些插入和删除 *** 作的索引维护可能比扫描表空间消耗更多的时间
三 数据完整性设计
完整性实现机制 实体完整性 主键
参照完整性 父表中删除数据 级联删除 受限删除 置空值父表中插入数据 受限插入 递归插入父表中更新数据 级联更新 受限更新 置空值
DBMS对参照完整性可以有两种方法实现 外键实现机制(约束规则)和触发器实现机制
用户定义完整性 NOT NULL CHECK 触发器
用约束而非商务规则强制数据完整性采用数据库系统实现数据的完整性 这不但包括通过标准化实现的完整性而且还包括数据的功能性 在写数据的时候还可以增加触发器来保证数据的正确性 不要依赖于商务层保证数据完整性 它不能保证表之间(外键)的完整性所以不能强加于其他完整性规则之上
强制指示完整性在有害数据进入数据库之前将其剔除 激活数据库系统的指示完整性特性 这样可以保持数据的清洁而能迫使开发人员投入更多的时间处理错误条件
使用查找控制数据完整性控制数据完整性的最佳方式就是限制用户的选择 只要有可能都应该提供给用户一个清晰的价值列表供其选择 这样将减少键入代码的错误和误解同时提供数据的一致性
采用视图为了在数据库和应用程序代码之间提供另一层抽象 可以为应用程序建立专门的视图而不必非要应用程序直接访问数据表 这样做还等于在处理数据库变更时给你提供了更多的自由
lishixinzhi/Article/program/SQL/201311/16258
--我也是初学者,共同研究下,你最好一段一段执行,要不就没意义了
use school
drop table teacher1
drop table student1
go
create table teacher1
(
t_id int primary key,
t_name nvarchar(10) not null
)
go
insert into teacher1 values(1347,'张三')
insert into teacher1 values(2680,'李四')
insert into teacher1 values(6379,'王五')
go
create table student1
(
s_id int primary key,
t_id int
)
go
alter table student1
add constraint FK foreign key(t_id) references teacher1(t_id) on update cascade
insert into student1 values(1,2680)
insert into student1 values(2,6379)
insert into student1 values(3,1347)
insert into student1 values(4,6379)
insert into student1 values(5,1347)
--两个表建好了,大概按照你的意思,不知道是不是这种情况
go
select from student1;
select from teacher1; --查询所有数据
go
--在student1表(外键表)中加入一组数据
insert into student1 values(6,1234) --失败了,因为外键表中外键的值必须是引用主键表中关联的主键的值
--也就是外键约束,或称参照完整性
--外键约束是约束外键的数据的取值的
insert into teacher1 values(1234,'童川') --然后在teacher1表(主键表)中加一组数据
--成功,外键约束对主键表被引用的主键无影响
insert into student1 values(6,1234) --成功,验证了失败的原因
go
select from student1;
select from teacher1; --再次查询所有数据
--on update cascade 这个东西我也没学过,百度了一下,大概明白了
go
update teacher1 set t_id = t_id + 10000
where t_name in('童川') --成功
update student1 set t_id = t_id + 10000 --提示与外键约束发生冲突
go
select from student1;
select from teacher1; --看到了么学生表中引用'童川'老师的数据的一列数据中t_id的值也随之改变
--我想这就是on update cascade的作用
以上就是关于数据库的4键2约束指的是什么全部的内容,包括:数据库的4键2约束指的是什么、数据库开发规范详细介绍[1]、两个已创建了永久关系的数据库表,设置其参照完整性的规则为更新级联,其含义是什么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)