约束的分类
在实际中,约束主要分为以下五种约束:
- · 主键约束:主键表示是一个唯一的标识,本身不能为空
|- 例如:身份证编号是唯一的,不可重复的,不可为空的
- · 唯一约束:在一个表中只允许建立一个主键约束,而其他列如果不希望出现重复值的话,则就可以使用唯一约束
- · 检查约束:检查一个列的内容是否合法
|- 例如:年龄,只能在 0~150 区间
|- 例如:性别,只能是男、女
- · 非空约束:姓名这样的字段里面的内容就不能为空
- · 外键约束:在两张表中进行约束操作
主键约束(PRIMARY KEY )
主键约束一般都是在 id 上使用,而且本身已经默认了内容不能为空。主键约束可以在建立表的时候指定:
范例:建立 person 表,在 pid 上增加主键约束
DROP TABLE person ; CREATE TABLE person ( pid VARCHAR2(18) PRIMARY KEY , name VARCHAR2(200) , age NUMBER(3) , birthday DATE , sex VARCHAR2(2) DEFAULT '男' ) ;
范例:插入数据,其中插入的主键重复和为空
INSERT INTO person(pid,name,age,birthday,sex) VALUES ('11111111111111111','张三',30,TO_DATE('1976-02-13','yyyy-mm-dd'),'女') ; INSERT INTO person(pid,name,age,birthday,sex) VALUES ('11111111111111111','李四',30,TO_DATE('1976-02-13','yyyy-mm-dd'),'男') ;
错误信息:ORA-00001: 违反唯一约束条件 (SCOTT.SYS_C0011321)
错误信息上给出的是一个编号的形式,实际上此编号就表示约束的名称
通过 CONSTRAINT 指定一个约束的名字
范例:将 Person 中的 pid 指定名称
DROP TABLE person ; CREATE TABLE person ( pid VARCHAR2(18) , name VARCHAR2(200) , age NUMBER(3) , birthday DATE , sex VARCHAR2(2) DEFAULT '男' , CONSTRAINT person_pid_pk PRIMARY KEY(pid) ) ;
表创建成功之后,再次加入重复的数据
INSERT INTO person(pid,name,age,birthday,sex) VALUES ('11111111111111111','张三',30,TO_DATE('1976-02-13','yyyy-mm-dd'),'女') ; INSERT INTO person(pid,name,age,birthday,sex) VALUES ('11111111111111111','李四',30,TO_DATE('1976-02-13','yyyy-mm-dd'),'男') ;
错误信息:ORA-00001: 违反唯一约束条件 (SCOTT.PERSON_PID_PK)
PERSON_PID_PK,就表示之前在建立数据库表的时候指定的约束名称
非空约束(NOT NULL)
使用非空约束,表示一个字段的内容不允许为空,即:插入数据的时候必须插入内容
DROP TABLE person ; CREATE TABLE person ( pid VARCHAR2(18) , name VARCHAR2(200) NOT NULL , age NUMBER(3) NOT NULL , birthday DATE , sex VARCHAR2(2) DEFAULT '男' , CONSTRAINT person_pid_pk PRIMARY KEY(pid) ) ;
范例:插入空的数据
INSERT INTO person(pid,name,age,birthday,sex) VALUES ('11111111111111111',null,30,TO_DATE('1976-02-13','yyyy-mm-dd'),'女') ; INSERT INTO person(pid,name,birthday,sex) VALUES ('22222222222222222','张三',TO_DATE('1976-02-13','yyyy-mm-dd'),'女') ;
在错误提示中,可以发现,已经明确的指明了错误所发生的字段名称
ORA-01400: 无法将 NULL 插入 ("SCOTT"."PERSON"."NAME")
ORA-01400: 无法将 NULL 插入 ("SCOTT"."PERSON"."AGE")
唯一约束(UNIQUE )
表示一个字段中的内容是唯一的,其他列不允许重复,假设:现在姓名不允许出现重名的情况
DROP TABLE person ; CREATE TABLE person ( pid VARCHAR2(18) , name VARCHAR2(200) UNIQUE NOT NULL , age NUMBER(3) NOT NULL , birthday DATE , sex VARCHAR2(2) DEFAULT '男' , CONSTRAINT person_pid_pk PRIMARY KEY(pid) ) ;
范例:向表中插入数据,数据插入两条
INSERT INTO person(pid,name,age,birthday,sex) VALUES ('11111111111111111','张三',30,TO_DATE('1976-02-13','yyyy-mm-dd'),'女') ; INSERT INTO person(pid,name,age,birthday,sex) VALUES ('22222222222222222','张三',30,TO_DATE('1976-02-13','yyyy-mm-dd'),'女') ;
第一条数据正常插入,第二条数据,名字违反了唯一约束条件,所以出现了以下的错误信息:
ORA-00001: 违反唯一约束条件 (SCOTT.SYS_C0011329)
此错误信息,也是使用自动的约束名称编号,所以要想指定约束的名称,也可以通过 CONSTRAINT关键字进行命名:
DROP TABLE person ; CREATE TABLE person ( pid VARCHAR2(18) , name VARCHAR2(200) NOT NULL , age NUMBER(3) NOT NULL , birthday DATE , sex VARCHAR2(2) DEFAULT '男' , CONSTRAINT person_pid_pk PRIMARY KEY(pid) , CONSTRAINT person_name_uk UNIQUE(name) ) ;
检查约束(CHECK)
使用检查约束来判断一个列中插入的内容是否合法,例如:年龄的取值范围、性别的取值范围。
DROP TABLE person ; CREATE TABLE person ( pid VARCHAR2(18) , name VARCHAR2(200) NOT NULL , age NUMBER(3) NOT NULL CHECK(age BETWEEN 0 AND 150), birthday DATE , sex VARCHAR2(2) DEFAULT '男' CHECK(sex IN ('男','女','中')), CONSTRAINT person_pid_pk PRIMARY KEY(pid) , CONSTRAINT person_name_uk UNIQUE(name) ) ;
范例:插入错误的年龄
INSERT INTO person(pid,name,age,birthday,sex) VALUES ('11111111111111111','张三',300,TO_DATE('1976-02-13','yyyy-mm-dd'),'女') ;
错误信息:ORA-02290: 违反检查约束条件 (SCOTT.SYS_C0011332)
错误信息中的所有约束错误都是采用的自动命名的形式,那么在 CHECK 中也可以使用手工命名的形式:
DROP TABLE person ; CREATE TABLE person ( pid VARCHAR2(18) , name VARCHAR2(200) NOT NULL , age NUMBER(3) NOT NULL, birthday DATE , sex VARCHAR2(2) DEFAULT '男', CONSTRAINT person_pid_pk PRIMARY KEY(pid) , CONSTRAINT person_name_uk UNIQUE(name) , CONSTRAINT person_age_ck CHECK(age BETWEEN 0 AND 150) , CONSTRAINT person_sex_ck CHECK(sex IN ('男','女','中')) ) ;
主- 外键约束(FOREIGN KEY)
主-外键约束是针对于两张表的约束,在使用主-外键关联的时候也要有以下的注意点;
- 在子表中设置的外键在父表中必须是主键
- 删除时应该先删除子表,再删除父表
存在关联关系无法删除子表,强制性的删除,不管约束,而直接删除,但是这种做法一般不使用
DROP TABLE book CASCADE CONSTRAINT ;
父表与子表存在关联数据,想要删除父表数据必须先将子表中对应数据删除
如果,希望一个表中的数据在删除时,可以自动删除掉其对应的子表记录,则就可以使用级联删除的操作
DROP TABLE book ; DROP TABLE person ; CREATE TABLE person ( pid VARCHAR2(18) , name VARCHAR2(200) NOT NULL , age NUMBER(3) NOT NULL, birthday DATE , sex VARCHAR2(2) DEFAULT '男', CONSTRAINT person_pid_pk PRIMARY KEY(pid) , CONSTRAINT person_name_uk UNIQUE(name) , CONSTRAINT person_age_ck CHECK(age BETWEEN 0 AND 150) , CONSTRAINT person_sex_ck CHECK(sex IN ('男','女','中')) ) ; CREATE TABLE book ( bid NUMBER PRIMARY KEY NOT NULL , bname VARCHAR(30) , bprice NUMBER(5,2) , pid VARCHAR2(18) , CONSTRAINT person_book_pid_fk FOREIGN KEY(pid) REFERENCES person(pid) ON DELETE CASCADE ) ;
修改约束
添加约束的语法如下:
ALTER TABLE 表名称 ADD CONSTRAINT 约束名称 约束类型(约束字段) ;
关于约束类型的命名一定要统一:
- · PRIMARY KEY:主键字段_PK
- · UNIQUE:字段_UK
- · CHECK:字段_CK
- · FOREIGN KEY:父字段_子字段_FK
如果要想增加主-外键约束,则可以创建一个没有约束的 book 表
DROP TABLE book ; CREATE TABLE book ( bid NUMBER, bname VARCHAR(30) , bprice NUMBER(5,2) , pid VARCHAR2(18) ) ;
为表中增加主键、外键约束
ALTER TABLE book ADD CONSTRAINT book_bid_PK PRIMARY KEY(bid) ; ALTER TABLE book ADD CONSTRAINT person_book_pid_fk FOREIGN KEY(pid) REFERENCES person(pid) ONDELETE CASCADE ;
可以增加约束,那么就可以删除约束,删除约束的时候要指定约束的名称
ALTER TABLE 表名称 DROP CONSTRAINT 约束名称 ;
约束:使用约束可以保证数据库表中的数据完整性
在 SQL 中约束一共分为以下五种:
- · 单表上的约束:
|- PRIMARY KEY,一个实体表一般都要去建立一个主键,表示唯一的编号
|- NOT NULL:一个列的内容不允许插入空值
|- UNIQU:表示此列的内容不允许重复
|- CHECK:表示此列的内容设置的时候要有限制
- · 关联表上的约束:
|- FOREIGN KEY,表示子表的取值与父表中的取值有所关联
|- 删除的时候应该先删除子表再删除父表
|- 如果现在要想直接删除父表,可以采用 Oracle 的强制手段
|- DROP TABLE 表名称 CASCADE CONSTRAINT
|- 级联删除:ON DELETE CASCADE,当父表中的内容被删除掉之后,子表的对应内容也被删除掉。
- · 约束本身也是可以修改的,但是不建议修改约束
|- 增加约束:ALTER TABLE ADD CONSTRAINT 约束名称 约束类型(约束字段)
|- 删除约束:ALTER TABLE DROP CONSTRAINT 约束名称
|- 如果在建立约束的时候没有给定约束的名称,系统会为其自动分配一个约束的名称,但是此名称在删除的时候就比较麻烦,所以建立表的时候可以采用 CONSTRAINT 语句指定约束的名字