源码-Oracle数据库管理-第六章-索引和约束-约束部分-Part 3
2016-10-02 15:40
716 查看
计算机的学习离不开上机实践,多练习,多实践才是正道。
--Started on 2016/10/02
--代码6.8 创建检查约束
--创建图书表
CREATE TABLE books_check(
book_id INT PRIMARY KEY, --图书Id
book_name VARCHAR2(200) CHECK(LENGTH(book_name)<100), --图书名称
qty_total NUMBER(9,2) CHECK (qty_total>0 AND qty_total<=5000) , --图书总数
--出版日期
publish_date DATE DEFAULT SYSDATE CHECK(publish_date>TO_DATE('2010-10-10','YYYY-MM-DD'))
);
DROP TABLE books_check;
--查看约束信息
--查询约束状态
SELECT constraint_name,
constraint_type,
status,
validated,
invalid
FROM user_constraints
WHERE table_name='BOOKS_CHECK';
--尝试插入一条不满足条件的记录,将导致Oracle异常(SYS_C0011557)
INSERT INTO books_check values (8,'Oracle从入门到精通',20000,null);
--查看异常详情
select * from user_constraints where table_name='BOOKS_CHECK';
select search_condition from user_constraints where constraint_name='SYS_C0011557';
--修改记录,重新插入,成功
INSERT INTO books_check values (8,'Oracle从入门到精通',2000,null);
--代码6.9 在约束中使用函数和布尔运算符
CREATE TABLE invoice_check_others
(
invoice_id NUMBER ,
invoice_name VARCHAR2(20),
invoice_type INT,
invoice_clerk VARCHAR2(20),
invoice_total NUMBER(9,2) DEFAULT 0 ,
payment_total NUMBER(9,2) DEFAULT 0,
--发票总数必须在1-1000之间
CONSTRAINT invoice_ck CHECK(invoice_total BETWEEN 1 AND 1000) ,
--发票名称必须为大写字母
CONSTRAINT check_invoice_name CHECK (invoice_name = UPPER(invoice_name)),
--发票类别必须在1,2,3,4,5,6,7之间
CONSTRAINT check_invoice_type CHECK (invoice_type IN (1,2,3,4,5,6,7)),
--发票处理员工编号不能为NULL值
CONSTRAINT check_invoice_clerk CHECK (invoice_clerk IS NOT NULL)
);
drop table invoice_check_others;
--尝试插入一条不满足条件的记录,将导致Oracle异常(SYS_C0011557)
INSERT INTO invoice_check_others values (9,'MEAl',7,820,1000,1001);
--查看异常详情
select * from user_constraints where table_name=upper('invoice_check_others');
select search_condition from user_constraints where constraint_name=upper('check_invoice_name');
--修改记录,重新插入,成功
INSERT INTO invoice_check_others values (9,upper('MEAL'),7,820,1000,1001);
--6.2.7 唯一性约束
--代码6.10 定义唯一性约束
CREATE TABLE bookCategory_unq(
cate_id INT PRIMARY KEY, --分类编号
cate_name VARCHAR2(50) UNIQUE, --分类名称,使用UNIQUE指定唯一性约束
cate_desc VARCHAR(100),
CONSTRAINT unq_cate_desc UNIQUE(cate_desc) --在表级别指定唯一性约束
--在表级别定义复合唯一性约束
-- CONSTRAINT unq_cate UNIQUE(cate_name,cate_desc)
);
drop table bookcategory_unq;
insert into bookcategory_unq values (1,'Oracle is interesting', 'This is a good book!');
insert into bookcategory_unq values (2,'Oracle is interesting!', 'This is a good book?');
insert into bookcategory_unq values (3,'Oracle is interesting?', 'This is a good book');
select * from user_constraints where table_name=upper('bookCategory_unq');
--查询索引信息(当创建一个唯一性的约束时,Oracle将在指定列上创建一个唯一性的索引)
SELECT index_name,index_type,uniqueness FROM user_indexes WHERE table_name='BOOKCATEGORY_UNQ';
--6.3.2 添加约束
--修改索引信息
DROP TABLE books_alt;
CREATE TABLE books_alt( --图书信息表
book_id INT, --图书表id
book_name VARCHAR2(50), --图书名称
book_desc VARCHAR2(100), --图书描述
book_qty NUMBER --图书数量
)
insert into books_alt values(1,'中国最美的散文','值得一读!',88);
insert into books_alt values(2,'中国最美的散文','值得一读!',66);
select * from books_alt;
delete from books_alt where book_qty=66;
--添加主键约束
ALTER TABLE books_alt ADD CONSTRAINT pk_books_alt PRIMARY KEY (book_id);
select * from user_constraints where table_name='BOOKS_ALT';
--添加约束并禁用之
ALTER TABLE books_alt ADD CONSTRAINT unq_book_name UNIQUE(book_name) DISABLE;
--重命名约束
ALTER TABLE books_alt RENAME CONSTRAINT unq_book_name TO book_name_unq;
--删除约束
ALTER TABLE books_alt DROP CONSTRAINT book_name_unq;
--删除主键
ALTER TABLE books_alt DROP PRIMARY KEY;
--查询约束状态
SELECT constraint_name,
constraint_type,
status,
validated,
invalid
FROM user_constraints
WHERE table_name='BOOKS_ALT';
SELECT * FROM BOOKS_ALT;
ALTER TABLE BOOKS_ALT DROP CONSTRAINT BOOK_NAME_UNQ;
ALTER TABLE books_alt ADD CONSTRAINT book_name_unq UNIQUE (book_name) DEFERRABLE DISABLE;
ALTER TABLE books_alt ENABLE NOVALIDATE CONSTRAINT book_name_unq;
--不加NOVALIDATE,将会报错
ALTER TABLE books_alt DISABLE CONSTRAINT book_name_unq;
--添加NOVALIDATE后,不会报错
ALTER TABLE books_alt ENABLE NOVALIDATE CONSTRAINT book_name_unq;
--约束的延迟特性
SELECT constraint_name,constraint_type,deferrable,deferred,validated,invalid,status FROM user_constraints WHERE table_name='BOOKS_ALT';
ALTER TABLE books_alt MODIFY CONSTRAINT book_name_unq INITIALLY DEFERRED;
--查询约束的类型
SELECT DISTINCT constraint_type FROM user_constraints;
--Completed on 2016/10/02
--Started on 2016/10/02
--代码6.8 创建检查约束
--创建图书表
CREATE TABLE books_check(
book_id INT PRIMARY KEY, --图书Id
book_name VARCHAR2(200) CHECK(LENGTH(book_name)<100), --图书名称
qty_total NUMBER(9,2) CHECK (qty_total>0 AND qty_total<=5000) , --图书总数
--出版日期
publish_date DATE DEFAULT SYSDATE CHECK(publish_date>TO_DATE('2010-10-10','YYYY-MM-DD'))
);
DROP TABLE books_check;
--查看约束信息
--查询约束状态
SELECT constraint_name,
constraint_type,
status,
validated,
invalid
FROM user_constraints
WHERE table_name='BOOKS_CHECK';
--尝试插入一条不满足条件的记录,将导致Oracle异常(SYS_C0011557)
INSERT INTO books_check values (8,'Oracle从入门到精通',20000,null);
--查看异常详情
select * from user_constraints where table_name='BOOKS_CHECK';
select search_condition from user_constraints where constraint_name='SYS_C0011557';
--修改记录,重新插入,成功
INSERT INTO books_check values (8,'Oracle从入门到精通',2000,null);
--代码6.9 在约束中使用函数和布尔运算符
CREATE TABLE invoice_check_others
(
invoice_id NUMBER ,
invoice_name VARCHAR2(20),
invoice_type INT,
invoice_clerk VARCHAR2(20),
invoice_total NUMBER(9,2) DEFAULT 0 ,
payment_total NUMBER(9,2) DEFAULT 0,
--发票总数必须在1-1000之间
CONSTRAINT invoice_ck CHECK(invoice_total BETWEEN 1 AND 1000) ,
--发票名称必须为大写字母
CONSTRAINT check_invoice_name CHECK (invoice_name = UPPER(invoice_name)),
--发票类别必须在1,2,3,4,5,6,7之间
CONSTRAINT check_invoice_type CHECK (invoice_type IN (1,2,3,4,5,6,7)),
--发票处理员工编号不能为NULL值
CONSTRAINT check_invoice_clerk CHECK (invoice_clerk IS NOT NULL)
);
drop table invoice_check_others;
--尝试插入一条不满足条件的记录,将导致Oracle异常(SYS_C0011557)
INSERT INTO invoice_check_others values (9,'MEAl',7,820,1000,1001);
--查看异常详情
select * from user_constraints where table_name=upper('invoice_check_others');
select search_condition from user_constraints where constraint_name=upper('check_invoice_name');
--修改记录,重新插入,成功
INSERT INTO invoice_check_others values (9,upper('MEAL'),7,820,1000,1001);
--6.2.7 唯一性约束
--代码6.10 定义唯一性约束
CREATE TABLE bookCategory_unq(
cate_id INT PRIMARY KEY, --分类编号
cate_name VARCHAR2(50) UNIQUE, --分类名称,使用UNIQUE指定唯一性约束
cate_desc VARCHAR(100),
CONSTRAINT unq_cate_desc UNIQUE(cate_desc) --在表级别指定唯一性约束
--在表级别定义复合唯一性约束
-- CONSTRAINT unq_cate UNIQUE(cate_name,cate_desc)
);
drop table bookcategory_unq;
insert into bookcategory_unq values (1,'Oracle is interesting', 'This is a good book!');
insert into bookcategory_unq values (2,'Oracle is interesting!', 'This is a good book?');
insert into bookcategory_unq values (3,'Oracle is interesting?', 'This is a good book');
select * from user_constraints where table_name=upper('bookCategory_unq');
--查询索引信息(当创建一个唯一性的约束时,Oracle将在指定列上创建一个唯一性的索引)
SELECT index_name,index_type,uniqueness FROM user_indexes WHERE table_name='BOOKCATEGORY_UNQ';
--6.3.2 添加约束
--修改索引信息
DROP TABLE books_alt;
CREATE TABLE books_alt( --图书信息表
book_id INT, --图书表id
book_name VARCHAR2(50), --图书名称
book_desc VARCHAR2(100), --图书描述
book_qty NUMBER --图书数量
)
insert into books_alt values(1,'中国最美的散文','值得一读!',88);
insert into books_alt values(2,'中国最美的散文','值得一读!',66);
select * from books_alt;
delete from books_alt where book_qty=66;
--添加主键约束
ALTER TABLE books_alt ADD CONSTRAINT pk_books_alt PRIMARY KEY (book_id);
select * from user_constraints where table_name='BOOKS_ALT';
--添加约束并禁用之
ALTER TABLE books_alt ADD CONSTRAINT unq_book_name UNIQUE(book_name) DISABLE;
--重命名约束
ALTER TABLE books_alt RENAME CONSTRAINT unq_book_name TO book_name_unq;
--删除约束
ALTER TABLE books_alt DROP CONSTRAINT book_name_unq;
--删除主键
ALTER TABLE books_alt DROP PRIMARY KEY;
--查询约束状态
SELECT constraint_name,
constraint_type,
status,
validated,
invalid
FROM user_constraints
WHERE table_name='BOOKS_ALT';
SELECT * FROM BOOKS_ALT;
ALTER TABLE BOOKS_ALT DROP CONSTRAINT BOOK_NAME_UNQ;
ALTER TABLE books_alt ADD CONSTRAINT book_name_unq UNIQUE (book_name) DEFERRABLE DISABLE;
ALTER TABLE books_alt ENABLE NOVALIDATE CONSTRAINT book_name_unq;
--不加NOVALIDATE,将会报错
ALTER TABLE books_alt DISABLE CONSTRAINT book_name_unq;
--添加NOVALIDATE后,不会报错
ALTER TABLE books_alt ENABLE NOVALIDATE CONSTRAINT book_name_unq;
--约束的延迟特性
SELECT constraint_name,constraint_type,deferrable,deferred,validated,invalid,status FROM user_constraints WHERE table_name='BOOKS_ALT';
ALTER TABLE books_alt MODIFY CONSTRAINT book_name_unq INITIALLY DEFERRED;
--查询约束的类型
SELECT DISTINCT constraint_type FROM user_constraints;
--Completed on 2016/10/02
相关文章推荐
- 源码-Oracle数据库管理-第六章-索引和约束-约束部分-Part 1
- 源码-Oracle数据库管理-第六章-索引和约束-约束部分-Part 2
- 源码-Oracle数据库管理-第十三章-子程序和包-Part 1(定义子程序)
- 源码-Oracle数据库管理-第十三章-子程序和包-Part 4(定义PL/SQL包)
- 源码-Oracle数据库管理-第九章-SQL查询-Part 5(分组查询)
- 源码-Oracle数据库管理-第十一章-Oracle内置函数-Part 4(类型转换函数)
- 源码-Oracle数据库管理-第十章-数据表操作-Part 4(删除数据)
- 源码-Oracle数据库管理-第十三章-子程序和包-Part 2(定义子程序)
- 源码-Oracle数据库管理-第九章-SQL查询-Part 1(基本查询)
- 源码-Oracle数据库管理-第十章-数据表操作-Part 1(插入数据)
- 源码-Oracle数据库管理-第十一章-Oracle内置函数-Part 3(数字型函数和日期时间函数)
- 源码-Oracle数据库管理-第十二章-使用PL/SQL创建Oracle程序-Part 1(PL/SQL基础)
- 源码-Oracle数据库管理-第八章-序列和同义词-Part 1(序列)
- 源码-Oracle数据库管理-第十章-数据表操作-Part 2(插入数据)
- 源码-Oracle数据库管理-第十二章-使用PL/SQL创建Oracle程序-Part 4(PL/SQL语言概览)
- 源码-Oracle数据库管理-第十三章-子程序和包-Part 3(子程序参数)
- 源码-Oracle数据库管理-第七章-视图-Part 2
- 源码-Oracle数据库管理-第七章-视图-Part 3(物化视图)
- 源码-Oracle数据库管理-第十一章-Oracle内置函数-Part 1(字符型函数)
- 源码-Oracle数据库管理-第十章-数据表操作-Part 3(更新数据)