3.2约束(重点)
在数据库表的开发中,约束是必不可少的支持,使用约束可以
更好的保证数据库中数据的完整性
3.2.1约束的分类
在实际中,约束主要分为以下五种约束:
1.主键约束:主键表示是一个唯一的标识,本身不能为空
例如:身份证号码是唯一分,不可重复的,不可为空
2.唯一约束:在一个表中只允许建立一个主键约束,而其他列
如果不希望出现重复值ude话,那么就可以使用唯一的约束
3.检查约束:检查一个列的内容是否合法
例如年龄只能在0-150之间
例如性别只能是男 女 中性
4.非空约束:姓名这样的字段内容就不能为空
5.外键约束:在两张表中进行约束操作
3.2.2主键约束(PRIMARY KEY)
主键约束一般都是在ID上使用,而且本身已经默认了内容不能为空,
主键约束可以在建议表的时候指定:
范例:建立person表 pid使用主键约束
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('320882198711262832','张三',30,TO_DATE
('1987-11-26','yyyy-mm-dd'),'女');
INSERT INTO person(pid,name,age,birthday)
VALUES('320882198711262832','李四',30,TO_DATE
('1988-01-16','yyyy-mm-dd'));
此时显示错误信息:违反唯一约束条件,但是错误信息不友好
测试插入空值:
INSERT INTO person(name,age,birthday)
VALUES('李四',30,TO_DATE
('1988-01-16','yyyy-mm-dd'));
第 1 行出现错误:
ORA-01400: 无法将 NULL 插入 ("SCOTT"."PERSON"."PID")
错误信息为 用户SCOTT 下的person表中的PID字段不能为空
以上的约束是属于系统自动分配好的约束名称,也可以通过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)
);
然后重复上面的 插入重复PID 的SQL语句和NULL值的SQL语句,
我们发现报的错误和之前完全一致
CONSTRAINT person_pid_pk 就表示之前在建立数据库表的时候指定的约束名称
3.2.3非空约束(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,age,birthday)
VALUES('320882198711262832',30,TO_DATE
('1988-01-16','yyyy-mm-dd'));
第 1 行出现错误:
ORA-01400: 无法将 NULL 插入 ("SCOTT"."PERSON"."NAME")
插入 age 也是一样
3.2.4唯一约束(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('1111111111','张三',30,TO_DATE
('1987-11-26','yyyy-mm-dd'),'女');
第一条插入成功
INSERT INTO person (pid,name,age,birthday,sex)
VALUES('320882198711262832','张三',30,TO_DATE
('1987-11-26','yyyy-mm-dd'),'女');
第 1 行出现错误:
ORA-00001: 违反唯一约束条件
注意:使用 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)
);
重复上面的插入数据操作,此时的错误信息为
第 1 行出现错误:
ORA-00001: 违反唯一约束条件 (SCOTT.PERSON_NAME_UK)
我们很明确的看到了违反UNIQUE的字段是name
3.2.3检查约束(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('320882198711262832','张三',300,TO_DATE
('1987-11-26','yyyy-mm-dd'),'女');
错误信息为:
第 1 行出现错误:
ORA-02290: 违反检查约束条件 (SCOTT.SYS_C009689)
我们接着插入 错误的性别
INSERT INTO person (pid,name,age,birthday,sex)
VALUES('320882198711262832','张三',300,TO_DATE
('1987-11-26','yyyy-mm-dd'),'无');
错误信息为:
第 1 行出现错误:
ORA-02290: 违反检查约束条件 (SCOTT.SYS_C009690)
我们看到错误信息和之前一样都是不友好的,而且是累加的
我们可以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 '男' CHECK(sex IN('男','女','中')),
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('男','女','中'))
);
第 1 行出现错误:
ORA-02290: 违反检查约束条件 (SCOTT.PERSON_SEX_CK)
错误信息比较易懂
3.2.6主-外键约束(FOREIGN KEY)
之前所讲的全部约束都是针对一张表的,那么主外键约束是针对两张表的约束
为什么需要主外键约束呢?
范例:要求完成一个程序,一本书要属于一个人
书本身应该是一个表,一个书中必须要有一个字段是属于哪个人的
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 '男' CHECK(sex IN('男','女','中')),
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,
BNAME VARCHAR(30),
BPRICE NUMBER(5,2),
pid VARCHAR2(18)
);
INSERT INTO person (pid,name,age,birthday,sex)
VALUES('320882198711262832','张三',30,TO_DATE
('1987-11-26','yyyy-mm-dd'),'女');
INSERT INTO book (bid,bname,bprice,pid) VALUES(
1,'JAVA SE',89.9,'320882198711262832');
确实符合要求,但是如果我们插入以下的数据
INSERT INTO book (bid,bname,bprice,pid) VALUES(
2,'JAVA SE',89.9,'000000000000');
此编号的人员并不存在,如果不存在,则此数据肯定不应该插入,
此时,如果想要解决这样的问题,则肯定要使用主外键约束
修改 book的建表语句为
DROP TABLE book;
CREATE TABLE book(
bid NUMBER PRIMARY KEY,
BNAME VARCHAR(30),
BPRICE NUMBER(5,2),
pid VARCHAR2(18),
CONSTRAINT person_book_pid_fk FOREIGN KEY(pid) REFERENCES person(pid)
);
我们整个脚本为:
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 '男' CHECK(sex IN('男','女','中')),
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,
BNAME VARCHAR(30),
BPRICE NUMBER(5,2),
pid VARCHAR2(18),
CONSTRAINT person_book_pid_fk FOREIGN KEY(pid) REFERENCES person(pid)
);
INSERT INTO person (pid,name,age,birthday,sex)
VALUES('320882198711262832','张三',30,TO_DATE
('1987-11-26','yyyy-mm-dd'),'女');
INSERT INTO book (bid,bname,bprice,pid) VALUES(
1,'JAVA SE',89.9,'320882198711262832');
此时进行上面的测试插入 得出错误信息
ORA-02291: 违反完整约束条件 (SCOTT.PERSON_BOOK_PID_FK) - 未找到父项关键字
此时,可以保证 两张表的数据的完整性,不会出现找不到对应数据的情况
在使用主外键关联的时候也要有以下的注意点:
在字表中设置的外键在父表中必须是逐渐
删除时应该先删除子表,再删除父表
测试:
DROP TABLE person; 报错 表中的主键被外键引用
DROP TABLE book; 删除成功
DROP TABLE person; 删除成功
如果我们不想删除子表,想只删除父表 可以使用强制性的删除手段
DROP TABLE person CASCADE CONSTRAINT 如下:
DROP TABLE person CASCADE CONSTRAINT;
不管约束,而直接删除,但是这种方法一般不使用
回顾 :
咱们之前学习的emp 和dept 也是主外键关联的2张表
范例:现在向emp表中增加一个50部门的员工(我们知道部门表里面没有50部门)
INSERT INTO emp(empno,ename,job,sal,mgr,hiredate,comm,deptno)
VALUES(8888,'张三','经理',90000,null,sysdate,null,50);
ORA-02291: 违反完整约束条件 (SCOTT.FK_DEPTNO) - 未找到父项关键字
无法插入成功
在主外键关联中 也可以使用级联删除的情况
以现在数据库中的数据为例:
DELETE FROM person WHERE pid='320882198711262832';
错误信息:违反完整约束条件 (SCOTT.PERSON_BOOK_PID_FK) - 已找到子记录
此时要想完成删除操作,则必须要将book表中对应的数据删除掉
如果,希望一个表中的数据在删除时,可以自动删除掉其对应的字表中对应的记录 修改如下
CREATE TABLE book(
bid NUMBER PRIMARY KEY,
BNAME VARCHAR(30),
BPRICE NUMBER(5,2),
pid VARCHAR2(18),
CONSTRAINT person_book_pid_fk FOREIGN KEY(pid) REFERENCES person(pid) ON DELETE CASCADE
);
完整的SQL脚本如下:
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 '男' CHECK(sex IN('男','女','中')),
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,
BNAME VARCHAR(30),
BPRICE NUMBER(5,2),
pid VARCHAR2(18),
CONSTRAINT person_book_pid_fk FOREIGN KEY(pid) REFERENCES person(pid)ON DELETE CASCADE
);
INSERT INTO person (pid,name,age,birthday,sex)
VALUES('320882198711262832','张三',30,TO_DATE
('1987-11-26','yyyy-mm-dd'),'女');
INSERT INTO book (bid,bname,bprice,pid) VALUES(
1,'JAVA SE',89.9,'320882198711262832');
建立好表并且插入好数据后,我们再进行删除
DELETE FROM person WHERE pid='320882198711262832';
我们发现删除成功了 此时再去book表中查询图书记录
SELECT * FROM book;
发现对应的记录也被删除了
3.2.7修改约束(了解)
如果一张表已经建议完成之后,则可以为其增加约束。
如我们通过下面的SQL语句建立了一个person表
CREATE TABLE person(
pid VARCHAR2(18),
name VARCHAR2(200)NOT NULL,
age NUMBER(3) NOT NULL ,
birthday DATE,
sex VARCHAR2(2) DEFAULT '男'
);
此时,需要为表中添加若干个约束,添加约束的语法如下:
ALTER TABLE 表名称 ADD CONSTRAINT 约束名称 约束类型(约束字段)
关于约束的类型的命名一定要统一;
PRIMARY KEY:主键字段_pk (主键约束)
UNIQUE:字段_UK(唯一约束)
CHECK:字段_CK(检查约束)
FOREIGN KEY:父字段_子字段_FK(外键约束)
范例:为person表 添加该有的约束
ALTER TABLE person ADD CONSTRAINT person_pid_pk PRIMARY KEY(pid);
ALTER TABLE person ADD CONSTRAINT person_name_UK UNIQUE(name);
ALTER TABLE person ADD CONSTRAINT person_age_CK CHECK(age BETWEEN 0 AND 150);
ALTER TABLE person ADD CONSTRAINT person_sex_CK CHECK(sex IN('男','女','中'));
如果想要增加主外键约束,则可以创建一个没有约束的book表
CREATE TABLE book(
bid NUMBER,
BNAME VARCHAR(30),
BPRICE NUMBER(5,2),
pid VARCHAR2(18)
);
为表中增加我们的主键和外键约束
ALTER TABLE book ADD CONSTRAINT persomn_bid_pk PRIMARY KEY(bid);
ALTER TABLE book ADD CONSTRAINT person_book_pid_fk FOREIGN KEY(pid) REFERENCES person(pid);
测试:直接删除person表
DROP TABLE person;
错误信息:表中的唯一主键被外键引用 说明外键关联生效了
既然可以增加约束,那么就可以删除约束,删除页数的时候要指定约束的名称。
ALTER TABLE 表名称 DROP CONSTRAINT 约束名称;
范例:删除person 表中的age 和sex上的约束
ALTER TABLE person DROP CONSTRAINT person_age_CK;
ALTER TABLE person DROP CONSTRAINT person_sex_CK;
ALTER TABLE book DROP CONSTRAINT person_book_pid_fk;
在数据库表的开发中,约束是必不可少的支持,使用约束可以
更好的保证数据库中数据的完整性
3.2.1约束的分类
在实际中,约束主要分为以下五种约束:
1.主键约束:主键表示是一个唯一的标识,本身不能为空
例如:身份证号码是唯一分,不可重复的,不可为空
2.唯一约束:在一个表中只允许建立一个主键约束,而其他列
如果不希望出现重复值ude话,那么就可以使用唯一的约束
3.检查约束:检查一个列的内容是否合法
例如年龄只能在0-150之间
例如性别只能是男 女 中性
4.非空约束:姓名这样的字段内容就不能为空
5.外键约束:在两张表中进行约束操作
3.2.2主键约束(PRIMARY KEY)
主键约束一般都是在ID上使用,而且本身已经默认了内容不能为空,
主键约束可以在建议表的时候指定:
范例:建立person表 pid使用主键约束
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('320882198711262832','张三',30,TO_DATE
('1987-11-26','yyyy-mm-dd'),'女');
INSERT INTO person(pid,name,age,birthday)
VALUES('320882198711262832','李四',30,TO_DATE
('1988-01-16','yyyy-mm-dd'));
此时显示错误信息:违反唯一约束条件,但是错误信息不友好
测试插入空值:
INSERT INTO person(name,age,birthday)
VALUES('李四',30,TO_DATE
('1988-01-16','yyyy-mm-dd'));
第 1 行出现错误:
ORA-01400: 无法将 NULL 插入 ("SCOTT"."PERSON"."PID")
错误信息为 用户SCOTT 下的person表中的PID字段不能为空
以上的约束是属于系统自动分配好的约束名称,也可以通过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)
);
然后重复上面的 插入重复PID 的SQL语句和NULL值的SQL语句,
我们发现报的错误和之前完全一致
CONSTRAINT person_pid_pk 就表示之前在建立数据库表的时候指定的约束名称
3.2.3非空约束(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,age,birthday)
VALUES('320882198711262832',30,TO_DATE
('1988-01-16','yyyy-mm-dd'));
第 1 行出现错误:
ORA-01400: 无法将 NULL 插入 ("SCOTT"."PERSON"."NAME")
插入 age 也是一样
3.2.4唯一约束(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('1111111111','张三',30,TO_DATE
('1987-11-26','yyyy-mm-dd'),'女');
第一条插入成功
INSERT INTO person (pid,name,age,birthday,sex)
VALUES('320882198711262832','张三',30,TO_DATE
('1987-11-26','yyyy-mm-dd'),'女');
第 1 行出现错误:
ORA-00001: 违反唯一约束条件
注意:使用 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)
);
重复上面的插入数据操作,此时的错误信息为
第 1 行出现错误:
ORA-00001: 违反唯一约束条件 (SCOTT.PERSON_NAME_UK)
我们很明确的看到了违反UNIQUE的字段是name
3.2.3检查约束(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('320882198711262832','张三',300,TO_DATE
('1987-11-26','yyyy-mm-dd'),'女');
错误信息为:
第 1 行出现错误:
ORA-02290: 违反检查约束条件 (SCOTT.SYS_C009689)
我们接着插入 错误的性别
INSERT INTO person (pid,name,age,birthday,sex)
VALUES('320882198711262832','张三',300,TO_DATE
('1987-11-26','yyyy-mm-dd'),'无');
错误信息为:
第 1 行出现错误:
ORA-02290: 违反检查约束条件 (SCOTT.SYS_C009690)
我们看到错误信息和之前一样都是不友好的,而且是累加的
我们可以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 '男' CHECK(sex IN('男','女','中')),
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('男','女','中'))
);
第 1 行出现错误:
ORA-02290: 违反检查约束条件 (SCOTT.PERSON_SEX_CK)
错误信息比较易懂
3.2.6主-外键约束(FOREIGN KEY)
之前所讲的全部约束都是针对一张表的,那么主外键约束是针对两张表的约束
为什么需要主外键约束呢?
范例:要求完成一个程序,一本书要属于一个人
书本身应该是一个表,一个书中必须要有一个字段是属于哪个人的
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 '男' CHECK(sex IN('男','女','中')),
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,
BNAME VARCHAR(30),
BPRICE NUMBER(5,2),
pid VARCHAR2(18)
);
INSERT INTO person (pid,name,age,birthday,sex)
VALUES('320882198711262832','张三',30,TO_DATE
('1987-11-26','yyyy-mm-dd'),'女');
INSERT INTO book (bid,bname,bprice,pid) VALUES(
1,'JAVA SE',89.9,'320882198711262832');
确实符合要求,但是如果我们插入以下的数据
INSERT INTO book (bid,bname,bprice,pid) VALUES(
2,'JAVA SE',89.9,'000000000000');
此编号的人员并不存在,如果不存在,则此数据肯定不应该插入,
此时,如果想要解决这样的问题,则肯定要使用主外键约束
修改 book的建表语句为
DROP TABLE book;
CREATE TABLE book(
bid NUMBER PRIMARY KEY,
BNAME VARCHAR(30),
BPRICE NUMBER(5,2),
pid VARCHAR2(18),
CONSTRAINT person_book_pid_fk FOREIGN KEY(pid) REFERENCES person(pid)
);
我们整个脚本为:
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 '男' CHECK(sex IN('男','女','中')),
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,
BNAME VARCHAR(30),
BPRICE NUMBER(5,2),
pid VARCHAR2(18),
CONSTRAINT person_book_pid_fk FOREIGN KEY(pid) REFERENCES person(pid)
);
INSERT INTO person (pid,name,age,birthday,sex)
VALUES('320882198711262832','张三',30,TO_DATE
('1987-11-26','yyyy-mm-dd'),'女');
INSERT INTO book (bid,bname,bprice,pid) VALUES(
1,'JAVA SE',89.9,'320882198711262832');
此时进行上面的测试插入 得出错误信息
ORA-02291: 违反完整约束条件 (SCOTT.PERSON_BOOK_PID_FK) - 未找到父项关键字
此时,可以保证 两张表的数据的完整性,不会出现找不到对应数据的情况
在使用主外键关联的时候也要有以下的注意点:
在字表中设置的外键在父表中必须是逐渐
删除时应该先删除子表,再删除父表
测试:
DROP TABLE person; 报错 表中的主键被外键引用
DROP TABLE book; 删除成功
DROP TABLE person; 删除成功
如果我们不想删除子表,想只删除父表 可以使用强制性的删除手段
DROP TABLE person CASCADE CONSTRAINT 如下:
DROP TABLE person CASCADE CONSTRAINT;
不管约束,而直接删除,但是这种方法一般不使用
回顾 :
咱们之前学习的emp 和dept 也是主外键关联的2张表
范例:现在向emp表中增加一个50部门的员工(我们知道部门表里面没有50部门)
INSERT INTO emp(empno,ename,job,sal,mgr,hiredate,comm,deptno)
VALUES(8888,'张三','经理',90000,null,sysdate,null,50);
ORA-02291: 违反完整约束条件 (SCOTT.FK_DEPTNO) - 未找到父项关键字
无法插入成功
在主外键关联中 也可以使用级联删除的情况
以现在数据库中的数据为例:
DELETE FROM person WHERE pid='320882198711262832';
错误信息:违反完整约束条件 (SCOTT.PERSON_BOOK_PID_FK) - 已找到子记录
此时要想完成删除操作,则必须要将book表中对应的数据删除掉
如果,希望一个表中的数据在删除时,可以自动删除掉其对应的字表中对应的记录 修改如下
CREATE TABLE book(
bid NUMBER PRIMARY KEY,
BNAME VARCHAR(30),
BPRICE NUMBER(5,2),
pid VARCHAR2(18),
CONSTRAINT person_book_pid_fk FOREIGN KEY(pid) REFERENCES person(pid) ON DELETE CASCADE
);
完整的SQL脚本如下:
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 '男' CHECK(sex IN('男','女','中')),
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,
BNAME VARCHAR(30),
BPRICE NUMBER(5,2),
pid VARCHAR2(18),
CONSTRAINT person_book_pid_fk FOREIGN KEY(pid) REFERENCES person(pid)ON DELETE CASCADE
);
INSERT INTO person (pid,name,age,birthday,sex)
VALUES('320882198711262832','张三',30,TO_DATE
('1987-11-26','yyyy-mm-dd'),'女');
INSERT INTO book (bid,bname,bprice,pid) VALUES(
1,'JAVA SE',89.9,'320882198711262832');
建立好表并且插入好数据后,我们再进行删除
DELETE FROM person WHERE pid='320882198711262832';
我们发现删除成功了 此时再去book表中查询图书记录
SELECT * FROM book;
发现对应的记录也被删除了
3.2.7修改约束(了解)
如果一张表已经建议完成之后,则可以为其增加约束。
如我们通过下面的SQL语句建立了一个person表
CREATE TABLE person(
pid VARCHAR2(18),
name VARCHAR2(200)NOT NULL,
age NUMBER(3) NOT NULL ,
birthday DATE,
sex VARCHAR2(2) DEFAULT '男'
);
此时,需要为表中添加若干个约束,添加约束的语法如下:
ALTER TABLE 表名称 ADD CONSTRAINT 约束名称 约束类型(约束字段)
关于约束的类型的命名一定要统一;
PRIMARY KEY:主键字段_pk (主键约束)
UNIQUE:字段_UK(唯一约束)
CHECK:字段_CK(检查约束)
FOREIGN KEY:父字段_子字段_FK(外键约束)
范例:为person表 添加该有的约束
ALTER TABLE person ADD CONSTRAINT person_pid_pk PRIMARY KEY(pid);
ALTER TABLE person ADD CONSTRAINT person_name_UK UNIQUE(name);
ALTER TABLE person ADD CONSTRAINT person_age_CK CHECK(age BETWEEN 0 AND 150);
ALTER TABLE person ADD CONSTRAINT person_sex_CK CHECK(sex IN('男','女','中'));
如果想要增加主外键约束,则可以创建一个没有约束的book表
CREATE TABLE book(
bid NUMBER,
BNAME VARCHAR(30),
BPRICE NUMBER(5,2),
pid VARCHAR2(18)
);
为表中增加我们的主键和外键约束
ALTER TABLE book ADD CONSTRAINT persomn_bid_pk PRIMARY KEY(bid);
ALTER TABLE book ADD CONSTRAINT person_book_pid_fk FOREIGN KEY(pid) REFERENCES person(pid);
测试:直接删除person表
DROP TABLE person;
错误信息:表中的唯一主键被外键引用 说明外键关联生效了
既然可以增加约束,那么就可以删除约束,删除页数的时候要指定约束的名称。
ALTER TABLE 表名称 DROP CONSTRAINT 约束名称;
范例:删除person 表中的age 和sex上的约束
ALTER TABLE person DROP CONSTRAINT person_age_CK;
ALTER TABLE person DROP CONSTRAINT person_sex_CK;
ALTER TABLE book DROP CONSTRAINT person_book_pid_fk;
相关推荐
数据库完整性约束条件是确保数据库中数据准确无误和一致性的重要机制。这些约束条件分为静态和动态两类,分别针对数据在不同状态和变化过程中的规则。完整性检查主要关注三个方面:关系、元组和列。 首先,静态列级...
"国家开放大学 MySQL数据库应用实验训练1 在MySQL中创建数据库和表" 本实验训练旨在让学生掌握 MySQL 中的数据库和表的创建过程。 MySQL 是一种关系型数据库管理系统,广泛应用于各种领域。为提高学生的实践能力,...
达梦数据库
《MySQL数据库应用》实验训练1主要关注如何在MySQL环境中创建数据库和表,这是数据库管理的基础操作,对于学习数据库管理和应用开发至关重要。 首先,要进行实验训练,你需要确保你的计算机满足MySQL的运行环境。...
首先,**外键约束**是关系数据库中的一种机制,用于确保一个表(子表)中的数据与另一个表(主表)中的数据保持一致性。外键是子表中引用主表主键的一个字段,它强制了参照完整性的规则,即子表中的记录只能引用主表...
在本实验中,我们将探讨如何在SQL Server中创建数据库、关系表以及设置数据完整性约束。这涉及到数据库的基本操作,包括使用SQL语句来定义表结构、添加和修改字段、以及设置主键和外键约束。 首先,创建数据库的...
本文探讨了SQL Server数据库中的完整性约束,讨论了数据库完整性约束的重要性、分类和设计方法,并以T-SQL语句对数据库完整性约束进行了设计,实现了在数据库中存储数据的完整性、正确性和一致性。 一、 数据库完整...
外键约束是数据库中实现参照完整性的重要手段,它能够确保数据的一致性和正确性。外键约束方式有多种,包括级联、置空和禁止三种方式。 级联(Cascade)方式是指当主表中的记录被删除或更新时,从表中的相关记录也...
数据库的完整性约束是指数据库管理系统中对数据的一种限制,以确保数据的正确性、一致性和完整性。这种约束可以分为实体完整性约束、参照完整性约束和用户自定义完整性约束三个方面。 实体完整性约束是指对关系表中...
本实验主要针对《数据库原理及应用》课程中的基础知识部分,旨在让学生通过实践的方式熟悉数据库管理系统的基本操作,并掌握使用SQL Server Management Studio创建数据库和表的具体步骤。此外,还强调了通过SQL语句...
在交互式创建中,例如可以用表设计器打开数据库表 T,然后选择 SEX 列,在“列属性”框中的“默认值或绑定”输入框中输入‘男’,在说明中输入 DE_T_SEX。然后,单击工具栏中的“管理 CHECK 约束”按钮,打开表 T 的...
达梦数据库
在数据库管理中,图形化工具的使用可以大大提高工作效率,使得数据库表的创建和约束的设置变得更加直观和便捷。本文将详细介绍如何通过图形化方式创建数据库表及约束,并提供相应的SQL代码示例。 首先,了解图形化...
3. 非空约束:例如`TMS_student`表中的`sname`、`ssex`等字段,不允许为空。 4. 枚举约束:如`ssex`和`league`字段,限制输入的值只能是预设的枚举类型。 四、表数据操作 1. 插入数据:使用`INSERT INTO`命令将数据...
在SQL Server环境中,有时我们需要将一个数据库中的某个表复制到另一个数据库中,这可能是为了备份、数据迁移或创建测试环境等目的。根据提供的标题、描述和部分代码内容,我们可以整理出一套较为完整的操作流程和...
【实验报告 数据库创建表】涉及的知识点主要集中在SQL Server 2005数据库管理系统中,包括数据库的创建、表的构建、约束的设定、表间关系的建立以及数据库关系图的创建。以下是对这些知识点的详细解释: 1. **...
在OpenStack的数据库设计中,为了保持数据的一致性和完整性,使用了大量的外键约束来确保关联表之间的数据一致性。例如,“instances”表和其他相关表(如“security_group_instance_association”、“instance_info...
达梦数据库
主键约束保证了表内数据的唯一性,外键约束维护了表间的关系,非空约束确保字段不包含空值,唯一性约束保证某一字段的值在表中独一无二,而Check约束则限制字段值的范围,防止输入非法数据。 6. **约束的管理**: ...
《速达5000数据库表结构物理模型详解》 速达5000是一款广泛应用于中小型企业管理的软件,其强大的功能涵盖了财务、进销存、生产等多个方面。了解并掌握其数据库表结构的物理模型是进行软件二次开发、系统优化及数据...