一、Oracle的事务
1.使用特定格式插入日期值
1-使用to_date函数
范例2: 插入列带有日期的表,并按照年_月_日的格式
2-将emp表中的部门编号为10的数据导入到表beyond中 (进行行迁移!)
No.1步: 创建表beyond,字段分别是MyId number(4),MyName varchar2(50),MyDept number(5)
No.2步: 将表emp中的字段empno,ename,deptno中的记录批量导入表beyond中!
2.使用子查询更新数据
使用update语句更新数据时,既可以使用表达式或数据值直接修改数据,也可以使用子查询修改数据.
范例: 希望员工scott的岗位、工资、补助与员工SMITH一样。
3.Oracle中事务处理
什么叫事务?
用于保证数据的一致性,由一组相关的dml语句组成,该组的dml语句要么全部成功,要么全部失败。(dml语句:是指增、删、改3种语句)
事务和锁:
当执行事务操作时(dml语句),Oracle会在被作用的表上加锁,防止其它用户改表的结构,这对用户来说是非常重要的。
提交事务:
当执行使用commit语句可以提交事务,
当执行了commit语句子后,会确认事务的变化、结束事务、删除保存点、释放锁,
当使用commit语句结束事务子后,其它会话将可以查看到事务变化 后的新数据。
保存点:
是事务中的一点,用于取消部分事务,当结束事务时,会自动的删除事务所定义的所有保存点。当执行rollback时,通过指定保存点可以回退到指定的点。
回退事务:
只读事务:
是指只允许执行查询的操作,而不允许执行任何其它dml操作的事务,使用只读事务可以确保用户只能取得某时间点的数据。假定机票代售点每天18点开始统计今天的销售情况,这时可以使用只读事务。在设置了只读事务后,尽管其它会话可能会提交新的事务,但是只读事务将不会取得最新数据的变化,从而可以保证取得特定时间点的数据信息。
范例:
范例:当执行了commit语句子后,会确认事务的变化、结束事务、删除保存点、释放锁;
事务的几个重要操作:
1)设置保存点 SQL> savepoint a1;
2)取消部分事务 SQL> rollback to a1;
3)取消全部事务 SQL> rollback;
只读事务:
是指只允许执行查询的操作,而不允许执行任何其它dml操作的事务,使用只读事务可以确保用户只能取得某时间点的数据。假定机票代售点每天18点开始统计今天的销售情况,这时可以使用只读事务。在设置了只读事务后,尽管其它会话可能会提交新的事务,但是只读事务将不会取得最新数据的变化,从而可以保证取得特定时间点的数据信息。
范例:
No.1步: 设置只读事务且此窗口不能关闭,(用户system);
No.2步: 其它用户的操作都不生效了!(如:scott用户插入数据);
No.3步: 在No.1步的窗口再次查询是否有刚才插入的数据(没有!).
PS:
设置只读事务: SQL> set transaction read only;
设置读写事务: SQL> set transaction read write;
No.1步:注意:切换到系统管理员system用户下,设置只读事务,此窗口不能关闭,如下图所示:
No.2步:切换到scott用户,再插入1条记录,如下图所示:
No.3步:切换到system用户,查询scott.emp表,应该没有员工编号为7935这条记录!
二、约束:
重点:
在Oracle数据库中,数据完整性可以使用三种方法来实现:
(1)约束: 优点是易维护,并且具有最好的性能,故作为维护数据完整性的首选!
(2)触发器:
(3)应用程序(过程、函数):
1-约束:
约束用于确保数据库数据满足特定的商业规则,在Oracle中,约束包括:
(1) not null:
若在列上 定义了not null,那么当插入数据时,必须为列提供数据;
(2) unique:
若定义了唯一约束后,该列值不能重复的,但是可以为null(空);
(3) primary key:
用于唯一的标示行表示行的数据,当定义主键约束后,该列不但不能重复,而且不能为null 。
注:一张表最多只能有一个主键,但是可以有多个unqiue约束;
(4) foreign key:
用于定义主表和从表之间的关系。外键约束要定义在从表上,主表则必须具有主键约束或是unique约束,当定义外键约束后,要求外键列数据必须在主表的主键列存在或是为null ;
(5) check.
用于强制行数据必须满足的条件,假定在sal列上定义了check约束,并要求sal列值在100~200之间,如果不在100~200之间,则会提示出错。
范例:商店售货系统表设计案例:
No.1张表商品goods
SQL> create table goods
2 (
3 goodId char(8) primary key, --主键
4 goodName varchar2(30),
5 unitPrice number(10,2) check(unitprice>0),
6 category varchar2(8),
7 provider varchar2(30)
8 );
Table created
PS:如何修改字段名?
SQL> alter table goods rename column goodId to goodsId;
No.2张表客户customer
SQL> create table customer
2 (
3 customerId char(8) primary key, --主键
4 name varchar2(50) not null, --不为空
5 address varchar2(50),
6 email varchar2(50) unique,
7 sex char(3) default '男' check (sex in ('男','女')), --理论讲此处应为2个字符!
8 cardId char(18)
9 );
Table created
No.3张表购买purchase
SQL> create table purchase
2 (
3 customerId char(8) references customer(customerId), --外键,表组定义!列级定义foreign key
4 goodsId char(8) references goods(goodsId), --外键,表组定义!列级定义
5 nums number(10) check(nums between 1 and 30)
6 )
7 ;
Table created
范例:增加商品名也不能为空
SQL> alter table goods modify goodname not null;
Table altered
范例:×××也不能重复
SQL> alter table customer add constraint cardunique unique(cardid);
表已更改。 --constraint 约束;约束名为:cardunique
范例:如何删除约束
--删除约束
SQL> alter table customer drop constraint cardunique;
Table altered
范例:增加客户的住址只能是”海淀”、”朝阳”、”东城”、”西城”、”通州”、”崇文”。
SQL> alter table customer add constraint addresscheck
2 check (address in ('海淀','朝阳','东城','西城','通州','崇文'));
Table altered
范例:如何删除check(检测)
SQL> alter table customer drop constraint addresscheck;
Table altered