标签:char insert bsp ima 默认 无法 varchar2 修改 检查
在实际中,约束主要分为以下五种约束:
|- 例如:身份证编号是唯一的,不可重复的,不可为空的
|- 例如:年龄,只能在 0~150 随
|- 例如:性别,只能是男、女、中性
主键约束一般都是在 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,就表示之前在建立数据库表的时候指定的约束名称
使用非空约束,表示一个字段的内容不允许为空,即:插入数据的时候必须插入内容
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")
表示一个字段中的内容是唯一的,其他列不允许重复,假设:现在姓名不允许出现重名的情况
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) ) ;
使用检查约束来判断一个列中插入的内容是否合法,例如:年龄的取值范围、性别的取值范围。
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 (‘男‘,‘女‘,‘中‘)) ) ;
主-外键约束是针对于两张表的约束,在使用主-外键关联的时候也要有以下的注意点;
存在关联关系无法删除子表,强制性的删除,不管约束,而直接删除,但是这种做法一般不使用
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 约束名称 约束类型(约束字段) ;
关于约束类型的命名一定要统一:
如果要想增加主-外键约束,则可以创建一个没有约束的 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 约束名称 ;
标签:char insert bsp ima 默认 无法 varchar2 修改 检查
原文地址:http://www.cnblogs.com/aaron911/p/7768886.html