数据库-完整性约束
Posted EbowTang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库-完整性约束相关的知识,希望对你有一定的参考价值。
在数据库设计的时候,表的数据有一定的取值范围和联系,多表之间的数据有时也有一定的参照关系。在创建表和修改表时,可通过定义约束条件来保证数据的完整性和一致性。约束条件是一些规则,在对数据进行插入、删除和修改时要对这些规则进行验证,从而起到约束作用。
命名规则推荐采用:约束类型_约束字段:
- 非空约束:NN表名列名
- 唯一约束:UK表名列名
- 主键约束:PK_表名
- 外键约束:FK表名列名
- 检查约束:CK表名列名
关于表级约束和列级约束:
- 列级约束只能作用在一个列上
- 表级约束可以作用在多个列上(当然表级约束也可以作用在一个列上)
- 定义方式:列约束必须跟在列的定义后面,表约束不与列一起,而是单独定义。
- 非空(not null) 约束只能定义在列上
在KingbaseES数据库上测试了:
1,表的创建,及其约束定义:
1)直接表中定义约束方式
2)先定义表再定义约束
2,测试主键,非空,检查,唯一四种约束
drop table if exists student; --oracle没有这个语法,mysql和KES存在
----------------------------------------------
-----分段1:创建和测试约束表
----------------------------------------------
---1,直接定义表和列的约束
CREATE TABLE student (
stu_nmb number(8) primary key, --主键
stu_name char(8) not null, --非空约束
gender varchar2(2) check (gender in ('男','女')), --检查约束
age number(2) CHECK (age BETWEEN 18 AND 30), --检查约束
class varchar2 (40) not null,
email varchar2 (30) UNIQUE,
sdate DATE
);
---2,定义约束的另一种形式:先定义列再定义约束
--疑问,非空约束不支持写成下面这个?
--constraint con_name not null (stu_name),
CREATE TABLE student (
stu_nmb number(8),
stu_name char(8) not null,
gender varchar2(2),
age number(2), --检查约束
class varchar2 (40) not null,
email varchar2 (30),
sdate DATE,
constraint con_nmb primary key (stu_nmb),
constraint con_check check ( gender in ('男','女')),
constraint ch_age CHECK (age BETWEEN 18 AND 30), --检查约束
constraint uk_student_email UNIQUE (email)
);
select * from student;
---约束测试
--首先插入,正确
INSERT INTO student VALUES(2314,'张德田','男',19,'高三第6班','28@qq.com',SYSDATE);
--主键重复,报错
INSERT INTO student VALUES(2314,'吴海峰','男',18,'高三第1班','21@qq.com',SYSDATE);
--违反gender约束,报错
INSERT INTO student VALUES(2614,'五德田','变',29,'高三第8班','24@qq.com',SYSDATE);
--违反非空约束,报错
INSERT INTO student VALUES(2614,'','女',24,'高三第3班','98@qq.com',SYSDATE);
--唯一约束检查,报错
INSERT INTO student VALUES(9874,'张华乐','女',19,'高三第4班','28@qq.com',SYSDATE);
----------------------------------------------
-----分段2:创建表后再定义约束
----------------------------------------------
--3,没有约束的表,现将其进行创建
CREATE TABLE student (
stu_nmb number (8),
stu_name char (8),
gender varchar2 (2),
age number (2),
class varchar2 (40),
email varchar2 (30),
sdate DATE
);
--开始创建约束
alter table student add constraint pk_nmb primary key (stu_nmb); --oracle需要在add后打括号
alter table student add constraint ck_gender check (gender in ('男','女'));--oracle需要在add后打括号
--非空约束和oracle区别很大
--oracle:alter table student modify(stu_name constraint con_name not null);
ALTER TABLE student ALTER COLUMN stu_name SET NOT NULL;
ALTER TABLE student ADD CONSTRAINT uq_email UNIQUE (email);
select * from student;
---约束测试
--首先插入,正确
INSERT INTO student VALUES(2314,'张德田','男',19,'高三第6班','28@qq.com',SYSDATE);
--主键重复,报错
INSERT INTO student VALUES(2314,'吴海峰','男',18,'高三第1班','21@qq.com',SYSDATE);
--违反检查约束,报错
INSERT INTO student VALUES(2614,'五德田','变',29,'高三第8班','24@qq.com',SYSDATE);
--违反非空约束,报错
INSERT INTO student VALUES(2614,'','女',24,'高三第3班','98@qq.com',SYSDATE);
--唯一约束检查,报错
INSERT INTO student VALUES(9874,'张华乐','女',19,'高三第4班','28@qq.com',SYSDATE);
--移除指定列的四种类型的约束
ALTER TABLE student ALTER COLUMN stu_name DROP NOT NULL;
ALTER TABLE student DROP CONSTRAINT uq_email;
ALTER TABLE student DROP CONSTRAINT ck_gender;
ALTER TABLE student DROP CONSTRAINT pk_nmb;
--禁用与启用约束
ALTER TABLE student DISABLE CONSTRAINT con_nmb
ALTER TABLE student ENABLE CONSTRAINT con_nmb
INSERT INTO student VALUES(2314,'望德田','男',21,'高三第1班','42@qq.com',SYSDATE);
以上是关于数据库-完整性约束的主要内容,如果未能解决你的问题,请参考以下文章