`
zisefeiniao
  • 浏览: 172132 次
  • 性别: Icon_minigender_2
  • 来自: 成都
社区版块
存档分类
最新评论
阅读更多
居然有长度限制,气死我了,哼,本小姐继续发.



3.1  事务处理
所谓的事务就是指,组成这个事物的所有的操作要么同时成功,要么同时失败。
在Oracle中事务处理有三个核心的命令:
  • ROLLBACK:回退至前一次确认的命令或保存点(rollback to 保存点标签名)
  • COMMIT:提交
• SAVEPOINT:设置保存点(SAVEPOINT 保存点标签名)
事务处理是作业的逻辑单元。对数据库所做的所有修改都称为事务处理。只有将事物处理修改提交后,才能执行对数据库的永久修改。事务处理以可执行的SQL语句开头,并以ROLLBACK或COMMIT语句明确的结束,如果使用DDL语句,则隐式(即自动)结束。
在事务的处理中也会出现一种称为死锁的情况。等待另外一个session更新数据库的提交操作执行。
CREATE TABLE A(id NUMBER(4),name VARCHAR(10));
INSERT INTO A (id,name)VALUES(1001,'a');
SAVEPOINT TT;
INSERT INTO A (id,name)VALUES(1002,'b');
ROLLBACK TO TT;
SELECT *FROM A; //只有一条记录1001,a
COMMIT;
事务理解举例:
提款机取钱:
(1)比较用户名和密码正确,才正确登陆,否则失败  ----可以理解为一个事务
(2)当取款的时候,输入的金额,小于等于卡上的余额的时候,并且小于等于提款机中的余额,才能正确吐出钱。
这个过程,需要系统SELECT卡上的余额,需要SELECT提款机上的余额,需要UPDATE卡上的余额记录,需要UPDATE提款机中的余额记录,而要最终吐出钱,需要这些语句都成功,否则就都失败,都成功就COMMIT,失败就ROLLBACK;----可以理解为一个事务

3.2  约束
3.2.1  创建约束(重点)
1、在创建表结构的时候创建约束
CREATE TABLE 表名称

字段1  数据类型  【DEFAULT 默认值】【PRIMARY KEY】,
字段2  数据类型  【DEFAULT 默认值】【NOT NULL】【UNIQUE】,
字段3  数据类型  【DEFAULT 默认值】【NOT NULL】【CHECK(检查条件)】,
……
【ONSTRAINT 主表名_子表名_约束字段_fk  FOREIGN KEY (约束字段) REFERENCES 主表名(约束字段) 【ON DELETE CASCADE】】
);
或者
CREATE TABLE 表名称

字段1  数据类型  【DEFAULT 默认值】【NOT NULL】,
字段2  数据类型  【DEFAULT 默认值】【NOT NULL】,
字段3  数据类型  【DEFAULT 默认值】【NOT NULL】,
……
【CONSTRAINT 表名_约束字段_pk PRIMARY KEY(主键约束字段)】,
【CONSTRAINT 表名_约束字段_uk UNIQUE(唯一约束字段)】
【CONSTRAINT 表名_约束字段_ck CHECK(检查约束字段及检查条件)】
【CONSTRAINT 主表名_子表名_约束字段_fk  FOREIGN KEY (约束字段) REFERENCES 主表名(约束字段) 【ON DELETE CASCADE】】
);

建议:约束名的命名习惯是 表名_约束字段_约束约定标记(外键约束名的命名习惯是父表名_子表名_约束字段_约束约定标记),约束约定标记(主键约束pk、检查约束ck、唯一约束uk、外键约束fk)
提示:非空约束只能在字段后面添加,不能通过CONSTRAINT声明;
      外键约束只能通过CONSTRAINT声明,不能在字段后面添加;
说明:
A、在创建表结构的时候创建约束,可以在字段后面直接添加该字段的约束(这样的约束采用系统随机分配的标记名),也可以通过CONSTRAINT单独声明约束,可以自己声明约束名,这样方便之后对约束的修改也方便错误信息提示及找到错误根源;
B、 参数说明
 PRIMARY KEY:主键约束
 NOT NULL:非空约束
 UNIQUE:唯一约束
 CHECK:检查约束
 FOREIGN KEY:外键约束
FOREIGN KEY:在约束定义中指定子表中的列。
REFERENCES:指定父表名称和其中的列名称。
ON DELETE CASCADE:父表中的行被删除时,删除子表中对应的行。
ON DELETE SET NULL:父表中的行被删除时子表中对应行的外键列置NULL。

2、在创建表之后添加约束
   格式:ALTER TABLE 表名 ADD CONSTRAINT 约束名称 约束类型(约束字段);
3.2.2  检测约束
Oracle中的约束有:
A、非空约束:即表示该字段值不能为空;
B、唯一约束:即表示该字段值在整个表范围内不能出现重复值;
C、主键约束:表中每一行数据的主键具有唯一性,并且不能为空,用于其它表的外键参照,一般设置编号为主键;
D、检查约束:用于设置某一字段的取值合法性的检查,是否在某一范围之内;
E、外键约束:唯一用于设置两张表之间的约束,即检查字表的外键字段的取值是否在父表主键字段取值的范围之内;

约束报错集萃:
假设有person和book两张表
SQL脚本:
--删除person表
DROP TABLE person;
DROP TABLE book;

--创建person表
CREATE TABLE person
(pno INT,
pname VARCHAR2(30) NOT NULL,
pid VARCHAR2(18),
age INT ,
sex VARCHAR(4) DEFAULT('女'),
CONSTRAINT person_pno_pk PRIMARY KEY(pno),
CONSTRAINT person_pid_uk UNIQUE(pid),
CONSTRAINT person_age_ck CHECK(age BETWEEN 0 AND 200),
CONSTRAINT person_sex_ck CHECK(sex IN ('男','女','中性'))
);
--创建book表
CREATE TABLE book
(
bno NUMBER,
bname VARCHAR2(20),
pno INT,
CONSTRAINT book_bno_pk PRIMARY KEY(bno),
CONSTRAINT person_book_pno_fk FOREIGN KEY(pno) REFERENCES person(pno)
);

A、主键约束
--违反主键约束的唯一性
INSERT INTO person (pno,pname,pid,age,sex)
VALUES(1001,'b','000000000000000002',20,'男');
--报错
--INSERT INTO person (pno,pname,pid,age,sex)
--*
--第 1 行出现错误:
--ORA-00001: 违反唯一约束条件 (SCOTT.PERSON_PNO_PK)  //此处明确指出违反哪个约束,如果之前没有给约束起名,在此处就不清楚是哪个地方出错

--违反主键约束的非空性
INSERT INTO person (pname,pid,age,sex)
VALUES('b','000000000000000002',20,'男');
--报错
--INSERT INTO person (pname,pid,age,sex)
--*
--第 1 行出现错误:
--ORA-01400: 无法将 NULL 插入 ("SCOTT"."PERSON"."PNO")

B、非空约束
--违反反非空约束
INSERT INTO person (pno,pname,pid,age,sex)
VALUES(1002,null,'000000000000000002',20,'男');
--报错
--VALUES(1002,null,'000000000000000002',20,'男')
--            *
--第 2 行出现错误:
--ORA-01400: 无法将 NULL 插入 ("SCOTT"."PERSON"."PNAME")

C、唯一约束
--违反唯一约束
INSERT INTO person (pno,pname,pid,age,sex)
VALUES(1002,'b','000000000000000001',20,'男');
--报错
--INSERT INTO person (pno,pname,pid,age,sex)
--*
--第 1 行出现错误:
--ORA-00001: 违反唯一约束条件 (SCOTT.PERSON_PID_UK)

D、检查约束
--违反age检查约束
INSERT INTO person (pno,pname,pid,age,sex)
VALUES(1002,'b','000000000000000002',250,'男');
--报错
--INSERT INTO person (pno,pname,pid,age,sex)
--*
--第 1 行出现错误:
--ORA-02290: 违反检查约束条件 (SCOTT.PERSON_AGE_CK)

--违反sex检查约束
INSERT INTO person (pno,pname,pid,age,sex)
VALUES(1002,'b','000000000000000002',20,'人妖');
--报错
--INSERT INTO person (pno,pname,pid,age,sex)
--*
--第 1 行出现错误:
--ORA-02290: 违反检查约束条件 (SCOTT.PERSON_SEX_CK)

E、外键约束
--插入无效数据,1008在person中不存在
INSERT INTO book(bno,bname,pno)
VALUEs(3,'JAVA',1008);
--报错
--INSERT INTO book(bno,bname,pno)
--*
--第 1 行出现错误:
--ORA-02291: 违反完整约束条件 (SCOTT.PERSON_BOOK_PNO_FK) - 未找到父项关键字


--在没有删除子表前直接删除父表
DROP TABLE person;

--报错
--DROP TABLE person
--           *
--第 1 行出现错误:
--ORA-02449: 表中的唯一/主键被外键引用

注意:在删除具有外键关系的表的时候,先删除子表再删除父表
或者可以采用如下解决方法:
DROP TABLE person CASCADE CONSTRAINT;


--在没删除子表的数据的时候,先删除父表的数据
DELETE FROM person WHERE pno=1001;

--报错
--DELETE FROM person WHERE pno=1001
--*
--第 1 行出现错误:
--ORA-02292: 违反完整约束条件 (SCOTT.PERSON_BOOK_PNO_FK) - 已找到子记录

注意:在删除具有外键关系的父表的数据的时候,先删除子表对应的数据
或者可以采用如下解决方法,在删除父表的数据的时候同时删除子表中对应的数据
即在创建外键的时候指定级联删除

CREATE TABLE book
(
bno NUMBER,
bname VARCHAR2(20) NOT NULL,
pno INT,
CONSTRAINT book_bno_pk PRIMARY KEY(bno),
CONSTRAINT person_book_pno_fk FOREIGN KEY(pno) REFERENCES person(pno) ON DELETE CASCADE
);

3.2.3  删除约束
ALTER TABLE 表名 DROP CONSTRAINT 约束名称;

3.2.4  修改约束(了解)
1、如果在创建表结构的时候,某个约束没有创建,那么之后可以增加约束:
格式:ALTER TABLE 表名 ADD CONSTRAINT 约束名称 约束类型(约束字段);
2、如果在创建表结构的时候,某个约束建的不符合要求,那么就只能先删除该约束,然后重新添加

3.2.5  查看表约束(了解)
查询表的约束信息:
例如:查询表persons中的约束:
SELECT  constraint_name, constraint_type, search_condition
FROM  user_constraints
WHERE  table_name = 'PERSONS';
查询与约束相关的列:
例如:查询表persons中与约束相关的列:
SELECT constraint_name, column_name
FROM  user_cons_columns
WHERE  table_name = 'PERSONS';

3.2.6  使约束失效(了解)
语法:
ALTER TABLE table_name
  DISABLE(ENABLE) CONSTRAINT constraint_name [CASCADE];
说明:
 执行ALTER TABLE语句的DISABLE(ENABLE)子句来使约束失效。
 附带CASCADE选项使关联的约束失效。

3.3  序列(重点)
先创建一个temp表做演示,其相关SQL脚本如下:
--删除表
DROP TABLE temp;

--删除序列
DROP SEQUENCE noseq;
DROP SEQUENCE idseq;

--创建表
CREATE TABLE temp
(
no NUMBER(4),
nno NUMBER(4),
id VARCHAR2(8)
);

--创建序列
CREATE SEQUENCE noseq START WITH 1 INCREMENT BY 1;
CREATE SEQUENCE idseq;
总结:
(1)在创建序列的时候,可以通过START WITH 设置起始值
(2)在创建序列的时候,可以通过INCREMENT BY 设置增值,默认为1
(3)在创建序列的时候,可以通过MINVALUE n设置最小值
(4)在创建序列的时候,可以通过MAXVALUE n设置最大值
(5)在创建序列的时候,可以通过CACHE n设置缓存值
(6)在创建序列的时候,可以通过CYCLE指定是否循环序列号

以上就创建了两个简单的序列,序列的下标从0开始计算,在使用的时候使用以下两个操作完成:
• nextVal:取出下一个内容
• currVal:取出当前的内容

--插入测试数据
INSERT INTO temp (no,nno,id)
VALUES(noseq.nextVal,noseq.currVal,to_char(sysdate,'yyyy') || LPAD(idseq.nextVal,4,'0'));
INSERT INTO temp (no,nno,id)
VALUES(noseq.nextVal,noseq.currVal,to_char(sysdate,'yyyy') || LPAD(idseq.nextVal,4,'0'));
INSERT INTO temp (no,nno,id)
VALUES(noseq.nextVal,noseq.currVal,to_char(sysdate,'yyyy') || LPAD(idseq.nextVal,4,'0'));
…….

--查询
SELECT * FROM temp;


曾犯错误:
CREATE SEQUENCE noseq START WITH 0 INCREMENT BY 1;
报错:
CREATE SEQUENCE noseq START WITH 0 INCREMENT BY 1
*
第 1 行出现错误:
ORA-04006: START WITH 不能小于 MINVALUE
---不指定最小值,默认为1
解决办法:
可以指定最小值
CREATE SEQUENCE noseq minvalue 0 maxvalue 99999999 START WITH 0 INCREMENT BY 1;

3.4  同义词(理解)
一个同义词(synonym)可以为任何表,视图,快照,序列,过程,函数或包的别名,其定义存储在数据字典中。同义词因安全性和方便原因面经常使用,可用于:
(1)可屏蔽对象的名字及其持有者
(2)为分布式数据库的远程对象提供位置透明性
(3)为用户简化SQL语句
创建同义词的语法:
CREATE SYNONYM 同义词名称 FOR 用户名.表名称 ;
dual表是sys用户下的表,而现在scott用户下访问时不需要加sys.dual的原因就是同义词的作用。
CREATE SYNONYM dual FOR sys.dual;
有两种同义词:公用和专用。
创建公用同义词:
create public synonym public_emp for scott.emp; (公用同义词表示各个用户都能用)
创建专用同义词:
create synonym public_emp for scott.emp;   (只能当前用户能用)

删除同义词:
DROP SYNONYM dual;
3.5  视图(掌握)
1、什么是视图
作为Oracle方案中的一类对象,一个视图是一个被命名的SELECT语句,构成视图中的SELECT语句不能包含ORDER BY、伪列,其本身不包含数据,而是允许用户透过视图从表中查询数据或对表中的数据进行修改。
2、为什么要使用视图
 限制数据存取。
 使复杂的查询简单化。
 提供数据的独立性。
 对同组数据提供不同视角。
视图是一个被命名的SELECT语句,即一个视图封装了一个SELECT语句。
3、创建视图
CREATE VIEW 视图的名称 AS SELECT语句;
--在创建视图的时候,可以通过WITH CHECK OPTION来限制修改创建视图的条件,在最后添加该子句即可
--在创建视图的时候,可以通过WITH READ ONLY 来限制DML操作,在最后添加该子句即可
4、删除视图
DROP VIEW 视图的名称;
5、修改视图
没有ALTER VIEW语句,只能通过
CREATE OR REPLACE VIEW 视图的名称 AS SELECT语句;
重新创建视图来达到修改的目的

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics