在数据库设计中,表的数据具有一定的值范围和连接,多表之间的数据有时具有一定的参考关系。在创建和修改表时,可以定义约束条件,以确保数据的完整性和一致性。约束条件是一些规则,在插入、删除和修改数据时验证这些规则,从而发挥约束作用。
- 非空约束:NN表名列名
- 唯一约束:UK表名列名
- 主键约束:PK_表名
- 外键约束:FK表名列名
- 检查约束:CK表名列名
- 列级约束只能作用于一列
- 表级约束可以作用于多列(当然表级约束也可以作用于一列)
- 定义方法:列约束必须遵循列的定义,表约束不与列相同,而是单独定义。
- 非空(not null) 约束只能定义在列上
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 VALUES19.高三第六班,28@qq.com',SYSDATE); --重复主键,报错 INSERT INTO student VALUES(2314,吴海峰,男,18,高三第一班,21@qq.com',SYSDATE); --违反gender约束,报错 INSERT INTO student VALUES(2614,五德田,变化,29,高三第八班,24@qq.com',SYSDATE); --违反非空约束,报错 INSERT INTO student VALUES(2614,‘女’,24,高三第三班,'98@qq.com',SYSDATE); --唯一的约束检查,报错 INSERT INTO student VALUES(9874,张华乐,19,高三第四班,28@qq.com',SYSDATE); ---------------------------------------------- -----分段2:创建表后定义约束 ---------------------------------------------- --三、无约束表,现在创建它 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,高三第六班,28@qq.com',SYSDATE); --重复主键,报错 INSERT INTO student VALUES(2314,吴海峰,男,18,高三第一班,'21@qq.com',SYSDATE); --违反检查约束,报错 INSERT INTO student VALUES(2614,五德田,变化,29,高三第八班,24@qq.com',SYSDATE); --违反非空约束,报错 INSERT INTO student VALUES(2614,‘女’,24,高三第三班,‘98@qq.com',SYSDATE); --唯一的约束检查,报错 INSERT INTO student VALUES(9874,张华乐,女,19,高三第四班,'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,高三第一班,42@qq.com',SYSDATE);