添加、修改和删除数据
数据库中对数据进行的添加、修改和删除操作均属于数据库操纵语言(DML),这类类型的SQL语句只有执行数据控制语言(DCL)中的commit才能使之起作用,DCL语言中的rollback用于撤销DML语言操作:
一、添加数据
数据添加的方式有两种:
第一种:
语法:insert into table_name [(column_name1,column_name2,...,column_namen)] values (value1,value2,...valuen)
insert into student(id,name,mobile,address)
values ('9b4435ec-372c-456a-b287-e3c5aa23dff4','张三','12345678901','北京海淀');
commit;
注意:
1、字段列表的顺序可以不按照表中字段的顺序列出来,但对应值列表必须和字段名列表对应;
insert into student(mobile,address,id,name)
values ('18338945560','安徽六安','eb0a220a-60ae-47b6-9e6d-a901da9fe355','张李三');
commit;
2、对应值列表中的值如果是字符类型或日期类型,则需使用单引号引起来;
3、如果没有字段列表,则值列表中值的顺序必须按照实际表中字段的默认顺序进行排列
insert into student values ('a273ea66-0a42-48d2-a17b-388a2feea244','李%四','98765432130','北京东城区');
insert into student values ('6ab71673-9502-44ba-8db0-7f625f17a67d','王_五','98765432130','北京朝阳区');
commit;
第二种
insert into to_table_name [(column_name1,column_name2,...,column_namen)]
select column_name1,column_name2,...,column_namen from from_table_name
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 ……]
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;
注意:from关键字在Oracle数据库中可以没有,但是在MySQL数据库中必须要有
四、实务操作
当执行一组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:回滚当前事务到指定的保存点,从而丢弃保存点后对数据库的任何改变;
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语句结束执行状态。