oracle增删改及其事务控制

--删除之前创建乱七八糟的表

DROP TABLE DEPT1;

DROP TABLE DEPT2;

DROP TABLE emp2;

DROP TABLE emp5;

DROP TABLE MYEMP;

DROP TABLE MYEMP2;

DROP TABLE MYEMP3;

--新建立一个表,用于接下来操作
CREATE TABLE emp1
AS
SELECT EMPLOYEE_ID,LAST_NAME,HIRE_DATE,SALARY
FROM EMPLOYEES 
WHERE 1=2;

/*
into 可以省略
table 表名后面不加()指定哪些列的话默认就是要全部的列 在values()里面必须和列顺序(plsql中 desc 表名查看表顺序,navicate中,直接设计表查看)一一对应值
*/

--向表表中插入一条数据
INSERT INTO emp1 
VALUES('1','XXX',SYSDATE-3,9999)


SELECT * FROM emp1;

INSERT INTO emp1
VALUES('2','YYY',TO_DATE('1999-09-09','yyyy-MM-dd'),9998)


INSERT INTO emp1(LAST_NAME,HIRE_DATE,EMPLOYEE_ID,SALARY)
VALUES('ZZZ',TO_DATE('1999-09-09','yyyy-MM-dd'),'3',9997)


INSERT INTO emp1(LAST_NAME,HIRE_DATE,EMPLOYEE_ID)
VALUES('AAA',sysdate-9,'4')

-- 复制其他表数据
-- 34条
INSERT INTO emp1(EMPLOYEE_ID,HIRE_DATE,LAST_NAME,SALARY)
SELECT EMPLOYEE_ID,HIRE_DATE,LAST_NAME,SALARY 
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 80

-- 38条

SELECT * FROM emp1

-- 脚本方式插入数据
INSERT INTO emp1(EMPLOYEE_ID,LAST_NAME,HIRE_DATE,SALARY)
VALUES(&id,'&name',&salary,'&hire_date')


--修改数据

UPDATE emp1 
SET SALARY = 12000
WHERE EMPLOYEE_ID = 4

-- 提交事务

commit;

-- 把所有人工资修改到22000
UPDATE emp1
SET SALARY = 22000

-- 回滚事务 --头疼Navicat自动提交事务
rollback;

SELECT * FROM emp1;

--重新弄下数据,先清除数据,后新增数据。
truncate table emp1;


-- 根据employees复制一张新表

CREATE TABLE EMPLOYEES1
AS
SELECT * FROM EMPLOYEES;


-- 更新114号员工的工作和工资使其与205号员工相同

SELECT * FROM EMPLOYEES1;


UPDATE  EMPLOYEES1 
SET JOB_ID = (
							SELECT JOB_ID 
							FROM EMPLOYEES1 
							WHERE EMPLOYEE_ID = 205
							),
SALARY = (
					SELECT SALARY 
					FROM EMPLOYEES1
					WHERE EMPLOYEE_ID = 205
					)
WHERE EMPLOYEE_ID = 114 


SELECT * FROM EMPLOYEES1 WHERE EMPLOYEE_ID = 114;



UPDATE EMPLOYEES1
SET DEPARTMENT_ID = (
											SELECT EMPLOYEE_ID 
											FROM EMPLOYEES1 
											WHERE EMPLOYEE_ID = 100
											) 
WHERE JOB_ID = (
SELECT JOB_ID
FROM EMPLOYEES1
WHERE EMPLOYEE_ID = 200
)



-- 数据删除

-- 从employees1表中删除部门名称中含Public字符的部门id

DELETE FROM EMPLOYEES1
WHERE DEPARTMENT_ID = (
												SELECT DEPARTMENT_ID 
												FROM  DEPARTMENTS
												WHERE DEPARTMENT_NAME LIKE '%Public%'
												)



/*
语法归纳
增:
insert into table
values(...)

批量增
insert into table
select ... from table where ...

改(不设置where全表记录更新)
update table
set ...
where ...

删(不设置where全表记录删除)
delete from table
where ...

*/





/*
数据库事务:
事务:一组逻辑操作单元,使数据从一种状态变换到另一种状态
数据库事务由以下部分组成:
1.一个或多个DML语句
2.一个DDL(数据库定义语言)语句
3.一个DCL(数据控制语言)语句
*/



update employees1 set last_name = 'xxx' where employee_id = '206';

-- 回滚
rollback;

select last_name from employees1 where employee_id = '206'; 

commit;



-- saveponit x;指定保存点
select count(1) from employees1;

delete from employees1 where employee_id = '205';
savepoint A;



delete from employees1 where employee_id = '206';
savepoint B;

-- 回退到指定保存点操作之后
rollback to savepoint B;

rollback;

commit;

select * from employees1; 

delete from employees1 where employee_id = '200';
savepoint A; 

delete from employees1 where employee_id = '201';
savepoint B;

delete from employees1 where employee_id = '202';
savepoint C;


rollback to savepoint A;

select * from employees1;  -- 删除200之后的删除的数据回滚回来了

rollback; -- 删除的200回来了

/*
-- 独立性
  1.其他用户不能看到当前用户所做的改变,直到当前用户结束事务
  2.DML语句所涉及到的行被锁定,其他用户不能操作。 只有当前用户commit,或者锁被释放,其他用户才可以操作这个表

事务特性:
1、A (Atomicity) 原子性

原子性很容易理解,也就是说事务里的所有操作要么全部做完,要么都不做,事务成功的条件是事务里的所有操作都成功,只要有一个操作失败,整个事务就失败,需要回滚。

比如银行转账,从A账户转100元至B账户,分为两个步骤:1)从A账户取100元;2)存入100元至B账户。这两步要么一起完成,要么一起不完成,如果只完成第一步,第二步失败,钱会莫名其妙少了100元。

2、C (Consistency) 一致性

一致性也比较容易理解,也就是说数据库要一直处于一致的状态,事务的运行不会改变数据库原本的一致性约束。

例如现有完整性约束a+b=10,如果一个事务改变了a,那么必须得改变b,使得事务结束后依然满足a+b=10,否则事务失败。

3、I (Isolation) 独立性

所谓的独立性是指并发的事务之间不会互相影响,如果一个事务要访问的数据正在被另外一个事务修改,只要另外一个事务未提交,它所访问的数据就不受未提交事务的影响。

比如现在有个交易是从A账户转100元至B账户,在这个交易还未完成的情况下,如果此时B查询自己的账户,是看不到新增加的100元的。

4、D (Durability) 持久性

持久性是指一旦事务提交后,它所做的修改将会永久的保存在数据库上,即使出现宕机也不会丢失。

*/


猜你喜欢

转载自blog.csdn.net/qq_38188047/article/details/107313901