您的位置:首页 > 数据库 > Oracle

源码-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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐