Oracle数据库- 数据操作

Oracle数据库- 数据操作

数据的添加

create table user_info(
id char(36),
name varchar2(8),
age number(2)
)

alter table user_info
add (card_id char(18))

insert into user_info values ('1','李晨曦','19','171423381923894213');

数据添加第二种

       insert into to_table_name [(column_name1,column_name2,...,column_namen)]

       select column_name1,column_name2,...,column_namen from from_table_name

       e.g

create table new_student(
	id char(36) primary key,
	name varchar2(8) not null,
	mobile char(11),
	address varchar2(150)
)
insert into new_student select id,name,mobile,address from student
commit;

       注意:

              1、insert子句中字段名列表的数目和数据类型必须和select子句中选择的字段列表的数目和数据类型相匹配。数据类型不考虑长度,但是须比查出来的对应列的长度长或相等。

              2、select查询字段名可以和insert插入表对应字段名不一致。

修改数据:

语法:

              update table_name

              set column1=value1, column2=value2……

              [where ……]

       e.g

update student set address='辽宁大连高新区' where id='6ab71673-9502-44ba-8db0-7f625f17a67d';
commit; 

删除数据

语法:

              delete [from] table_name

              [where……]

delete from student where id='6ab71673-9502-44ba-8db0-7f625f17a67d';
commit;

事务操作:

       当执行一组DML操作时,为了确保数据的一致性,避免数据库产生错误数据,就需要通过事务(Transaction)使该组DML操作同时成功或失败,例如

create table account(
  id char(36) primary key,
  card_id varchar2(20) unique,
  name varchar2(8) not null,
  money number(10,2) default 0
)
insert into account values('6ab71673-9502-44ba-8db0-7f625f17a67d','1234567890','张三',1000);
insert into account (id,card_id,name) values('9883a53d-9127-4a9a-bdcb-96cf87afe831','0987654321','张三');
update account set money=money-100 where card_id= '1234567890';
update account set money=money+100 where card_id= '0987654321';--要求同时成功同时失败

       当执行第一个DML SQL语句时,事务开始,当出现以下情况时事务结束:

              1、执行了commit或rollback语句;

              2、执行了DDL语句(如建表语句)或DCL语句(如给用户授权),如下:

create table student(
  id      char(36) not null,
  name    varchar2(8) not null,
  mobile  char(11),
  address varchar2(150)
)
insert into student values ('0e0180a3-ec2f-4a72-b1ae-28d5f2be36ea','小明','18338954490','北京市大兴区');
create table user_info(
       id char(36) primary key
)--上面insert语句虽然没有执行commit或rollback,但是由于执行了本建表语句,使得事务被隐式提交

              3、数据库客户端程序退出或数据库崩溃时,为了保持数据一致性,也会结束事务。

       事务控制语句:

              1、commit:提交事务,使之前做的改变永久作用于数据库;

              2、rollback:回滚当前事务,丢弃所有未决的数据改变;

              3、savepoint name:在当前事务中标记保存点(非ANSL SQL标准);

              4、rollback to name:回滚当前事务到指定的保存点,从而丢弃保存点后对数据库的任何改变;

              e.g

update student set name='小明';
savepoint delete_data; --
delete from student;
rollback to delete_data;--实现了局部DML回滚,即删除操作被撤销
commit;

update student set name='小明';
delete from student;
rollback;--无法实现局部DML回滚
commit;

       注意:

              1、执行DML语句且没有结束事务时,如果需要查询数据库的真实改变情况,则要求在一个新的SQL Window窗口中执行查询语句:因为事务中所做的每一个操作在事务被提交之前都是临时的,在commit或rollback语句执行之前,DML语句首先影响该用户的数据库缓冲区,因为这些操作可以被恢复,而且因为是在该用户的数据缓冲区,所以在原SQL窗口中查询得到的是数据缓冲区的结果,不是数据库真实的数据;要想拿到数据库真实的数据,需要在新SQL窗口中执行查询语句,这样针对不同的用户,Oracle服务器用读一致性来确保每个用户看到的数据和上次提交时的数据相同。

              2、当一个用户执行DML语句时,如果其事物没有结束,则受影响的行被锁定,此时其它用户不能改变受影响行中的数据,后面用户所执行的DML语句会一直处于执行状态,直至前一个用户所执行DML语句事务结束,例如:

                a、在一个SQL Window中执行如下SQL语句,并且不执行事务结束语句

update student set name='小强' where id='0e0180a3-ec2f-4a72-b1ae-28d5f2be36ea';

                b、然后再在一个的SQL Window中执行如下SQL语句

delete from student where id='0e0180a3-ec2f-4a72-b1ae-28d5f2be36ea';

                      修改SQL语句执行后,PL/SQL Developer显示该语句已知处于执行状态,

                      当上面修改数据的事务结束,则下面删除数据SQL语句结束执行状态。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/monster_ayb/article/details/81456600