二十六、DML与事务

DML 数据操纵语言

插入数据(INSERT)

  1. 格式:
Insert  into 表名(列名, 列名, 列名, 列名…)values(值,值,值,值,值)
--简单写法:
Insert  into 表名values(值,值,值,值,值)

使用insert语句一次可以向数据库中插入一条记录

在插入时,对于字符和日期需要使用单引号引起来

-- 向emp表中插入一条记录
INSERT INTO emp(empno,ename,job,mgr,hiredate,sal,comm,deptno)
VALUES(1111,'李四','外卖员',7788,to_date('2020-10-1','yyyy-mm-dd'),2500,NULL,10);
-- 简单写法,省略列名
INSERT INTO emp VALUES(2222,'张三','程序员',7788,to_date('2021-1-1','yyyy-mm-dd'),3500,NULL,20);
  1. 向表中插入空值:
-- 向表中插入空值
-- 隐式方式,在列名中省略该列的值
INSERT INTO dept(deptno,dname) VALUES(50,'技术部');
-- 显式方式,在子句中指定空值
INSERT INTO dept VALUES(60,'财务部',null);
  1. 通过创建脚本向表中添加数据(该方式Navicat不支持):
-- 创建脚本插入
INSERT INTO dept(deptno,dname,loc)
VALUES(&deptno,'&dname','&loc');

在这里插入图片描述

  1. 从其他表中拷贝数据:
-- 创建一张emp1表,表只有结构,没有数据
CREATE TABLE emp1(
       empno  NUMBER(4) CONSTRAINT PK_EMP1 PRIMARY KEY,
       ename  VARCHAR2(10),
       job    VARCHAR2(9),
       mgr    NUMBER(4),
       hiredate DATE,
       sal    NUMBER(7,2),
       comm   NUMBER(7,2),
       deptno NUMBER(2)
);
SELECT * FROM emp1;
-- 从其他表中拷贝数据
INSERT INTO emp1 SELECT * FROM emp;

拷贝数据前:

在这里插入图片描述

拷贝数据后:

在这里插入图片描述

拷贝部分数据:

-- 拷贝部分数据(拷贝部门数为30的员工信息)
INSERT INTO emp1 SELECT * FROM emp WHERE deptno=30;

在这里插入图片描述

更新数据(UPDATE)

语法:UPDATE 表名 SET 列名=值,列名=值··· WHERE 条件

可以一次更新一条或多条记录,如果不加条件的执行更新语句,将导致表中的数据全部被更新。

-- 将emp表中的1111员工的部门改为30
UPDATE emp set deptno=30
WHERE empno=1111;

在更新中可以使用子查询:

-- 更新1111的job和工资,使其与2222相同
UPDATE emp set job=(SELECT job FROM emp WHERE empno=2222),
               sal=(SELECT sal FROM emp WHERE empno=2222)
WHERE empno=1111;

删除数据(DELETE)

语法:DELETE FROM 表名 WHERE 条件

删除数据必须加where条件,否则数据库会被清空

在Oracle中,删除语句中可以省略FROM 关键字;可以使用子查询

-- 删除1111
DELETE FROM emp WHERE empno=1111;
-- 在删除中使用子查询,删除与1111相同部门的人员
DELETE FROM emp WHERE deptno=(SELECT deptno FROM emp WHERE empno=1111);
-- oracle中,删除语句中可以省略from关键字
DELETE emp WHERE empno=1111;

事务

事务是对数据库一组逻辑操作单元,进行的一次完整性操作。事务的操作中,使数据从一种状态转变为另一种状态。

  • 数据库事务的组成:

    • 一个或多个DML语句组成
    • 一个DDL语句(数据定义语言Date Definition Language)
    • 一个DCL语句(数据控制语言Date Control Language)
  • 事务的开始:以第一个DML语句的执行作为开始

  • 事务的结束:

    • COMMIT(事务提交)
    • ROLLBACK(事务回滚)
    • DDL(自动提交)
    • 会话结束
    • 系统异常终止
  • COMMIT 和ROLLBACK 语句的优点:

    • 保证数据完整性
    • 数据改变被提交之前预览
    • 将逻辑上相关的操作分组

事务特性(ACID)

事务必须具备以下四个属性,简称ACID属性:

  • 原子性(Atomicity):事务是一个完整的操作。事务的各步操作是不可分的(原子的)。事务在执行时,其中所关联的一组逻辑相关的操作;要么都成功,要么都失败。
  • 一致性(Consistency):查询的数据始终是一致的
  • 隔离性(Isolation):对于其他会话来说,不能读取到其它会话未提交的事务。事务不可见
  • 持久性(Durability):事务一旦提交,对于数据来说,此时的事务的执行结果将具有持久性,结果被完整的保存

  • 锁的分类:分享锁和排他锁
    • 分享锁:排斥其他的排他锁,但是不排斥其他的共享锁
    • 排他锁:排斥其它排他锁和分享锁
  • DML锁(数据锁 date locks):主要用于保证数据的完整性,TX(行锁),TM(表锁)
    查看事务:select * from v$transaction;
    查看锁:select * from v&lock;
  • DDL锁(数据字典锁 dictionary locks):不要用于保护数据库对象的结构,表、索引、视图等结构的定义
  • SYSTEM锁(internal locks and latches):主要是保护数据库的内部数据

锁用途:只有当产生事务的时候,才会产生锁,保证数据的完整性、一致性、正确性。

自动加锁:

  • 做DML操作时:insert update delete 以及select···for update 有Oracle自动完成加锁
  • Oracle 的特有操作:select…for update 有Oracle 自动完成加锁。

在这里插入图片描述

控制事务

在这里插入图片描述

事务 DELETE、INSERT、UPDATE 当执行完成之后,如果我们确认事务的操作准确,就需要将数据进行持久化保存,此时就需要将数据进行commit。

如果操作之后,认为操作不当,需要回到修改之前的状态,此时我们可以进行回滚(rollback)。

设置保存点,回滚到保存点:

  • 使用savepoint 创建到保存点
  • 使用rollback to 回滚到刚刚使用savepoint 创建的保存点
savepoint point1;
rollback to point1;

事务的进程

自动提交的情况:

  • DDL
  • DCL
  • 会话正常结束
  • 会话异常结束或者系统异常,此时都会导致自动回滚

事务相关的操作为什么需要提交或者可以进行回滚:

  • 当我们在进行 insert 、update、delete 操作的时候,数据并不会直接写入到数据库文件,而是写入到缓冲区;
  • 所以当我们提交的时候,就是将缓冲区的数据提交到数据库文件,执行写入操作;
  • 而当我们进行回滚的时候,此时就会将缓冲区的数据进行清空。

事务相关操作:

  • 提交:当执行了insert 、 update 、 delete 操作的时候,在执行结束之后,都需要进行提交操作,只有提交了之后,数据的操作才是持久的
  • 回滚:当操作时,发生了异常,此时希望数据回到初始状态,此时就需要回滚数据;ROLLBACKR 回滚可以取消数据的改变、恢复数据的状态、同时释放锁。

回滚只针对没有提交的操作,一旦数据提交,则不能执行回滚。

小结:

语句功能
INSERT插入
UPDATE修正
DELETE删除
COMMIT提交
SAVEPOINT保存点
ROLLBACK回滚

创建和管理表

Oracle 是通过用户去管理数据的,要在Oracle 中存储数据:必须先创建表空间再创建用户再创建对象(表、索引、制图……)

  1. 表空间:一个或多个数据数据文件的逻辑集合。

表空间的分类:

  • 永久表空间:存放永久行的数据
  • 临时表空间:保存临时数据
  • Undo表空间:保存数据修改前的镜像

一个数据库下可以创建多个表空间,一个表空间可以被多个用户所拥有,一个用户下可以创建多个表。

在这里插入图片描述

  • 创建及查看表空间
-- 创建表空间 
create tablespace tbooks --表空间的名称
--数据文件的存放路径 对应虚拟机中的路径
datafile 'C:\app\BORN\virtual\oradata\orcl\tbooks.dbf'
size 100m --表空间的初始容量
autoextend on --表示表空间可以自动增长
next 10m --自动增长时的每次增长的空间
-- 查看所有的表空间
select * from DBA_TABLESPACES;
  • 创建临时表空间
--创建临时表空间
create temporary tablespace  lanqiao_temp
tempfile 'C:\app\Adminstrator\virtual\oradata\orcl\lanqiao_temp.dbf'
size 50m
autoextend on
next 10 
maxsize 20480M
extent management local;
  • 新建用户并指定表空间
-- 新建用户并指定表空间
create user library  -- 用户名
identified by root  -- 密码
default tablespace tbooks  -- 指定默认表空间
  1. 当用户创建成功之后,还需要给分配权限,才能登陆。
  • 权限分配
    Oracle 中默认存在的三个重要角色:connect 角色 、 resource 角色 、 dba 角色
    • connect 角色:
      • 是授权最终用户的典型的角色,最基本
      • 常见会话、修改会话、建立数据库连接、创建序列、创建同义词、创建视图
    • resource 角色:
      • 是授予开发人员的
      • 建表、建立触发器、存储过程
    • dba角色:
      • 拥有全部的特权,是系统的最高权限,只有dba才可以创建数据库结构,并且系统权限修改也需要DBA操作
      • DBA用户可以操作全体用户的任意的表,包括删除
-- 为用户授权
grant connect,resource to library;
grant dba to library;  -- 一般不给该权限
  1. Oracle 的数据类型
No数据类型描述
1Varchar,Varchar2表示一个字符串 Varchar定长 Varchar2可变长度
2NUMBERNumber(n) 表示整数 长度为n
Number(m,n) 表示整数 总长度为m 小数为n 整数m-n
3DATE表示日期类型
4CLOB表示大的文本类型 可存放4G内容
5BLOB表示大的二进制数据 可存放4G内容

创建表:

-- 创建books表
create table books( --表的名称
       bno number(10),
       bname varchar2(50),
       press varchar2(20),
       pdate date,
       writer varchar2(20),
       btype varchar2(20),
       ltime date,
       state varchar2(10),
);

插入数据:

insert into person(pid,pname,gender,birthday) values(1,'张三',1,to_date('2000-12-12','yyyy-mm-dd'));
commit;
insert into person(pid,pname,gender,birthday) values(2,'张三',1,sysdate);

表的删除(数据和结构都被删除,所有相正在运行的相关事务被提交,所有索引被删除,语句不能回滚):

drop table 表名;

清空表(删除表中的所有数据,释放表的存储空间,不能回滚):

truncate table 表名

表的修改:

表添加列:alter table 表名  add(列名 类型  默认值,[列名 类型  默认值])
表修改列:alter table 表名 modify(列名 类型  默认值,[列名 类型  默认值])
表删除列:alter table 表名 drop column 列名
-- 给emp1增加列location
alter table emp1 add(location varchar2(30));
-- 将location的字段修改为50
alter table person modify(location varchar2(50));

表的重命名:

-- 重命名表
-- 将employees2重命名为emp5
rename employees2 to emp5;

根据表创建新表:

-- 根据表employees创建employees2
create table employees2 as select * from employees;
-- 查看表
select * from employees2;

序列

创建序列:

CREATE SEQUENCE pid1;
-- nextval :取得序列的下一个值
-- currval:取得序列的当前值
SELECT PID.NEXTVAL FROM dual;
select pid.currval from dual;
-- 创建复杂的序列
CREATE SEQUENCE pid2
increment by 10     -- 每次增长的步长
start with 100;
 /*
     maxvalue  --最大值
     minvalue--最小值
     cycle/nocycle--是否是循环序列
*/
SELECT PID2.NEXTVAL FROM dual;
select pid2.currval from dual;
-- 序列的实际使用
insert into emp1(pid4,empno,ename,job,mgr,hiredate,sal,comm,deptno)
values(pid4.nextval,7788,'张三','外卖员',7654,null,1400,null,20);

约束

如果不指定约束名,Oracle server 自动按照SYS_Cn 的格式指定约束名。

创建和修改约束:

  • 建表的同时
  • 建表之后

表级约束和列级约束:

  • 作用范围:
    • 列级约束只能作用在一个列上
    • 表级约束可以作用在多个列上(也可以一个)
  • 定义方式:列约束必须跟在列的定义后面,表约束不与列约束一起,而是单独定义。

非空约束(not null)

作用:保证插入的值不为空,是作用域字段

create table STU
(
  stu_id         NUMBER(8) not null,
  stu_name       VARCHAR2(20)
  constraint stu_age_uu not null,  -- 非空约束的另一种写法
  stu_age        NUMBER(4),
  stu_schooldate DATE
)

在这里插入图片描述

唯一约束(Unique)

Unique 表示该字段的值不能重复,值唯一,允许出现多个空值。

create table stu(
       stu_id number(8) not null,
       stu_name varchar2(20)  UNIQUE,  -- 增加唯一约束
       stu_age number(4),
       stu_schooldate date,
       stu_email varchar2(50),
       constraint stu_email_uk  UNIQUE(stu_email)  -- 增加唯一约束
);

在这里插入图片描述

主键约束(Primary key)

Primary key = not null + unique

可以定义在表或列上。

create table stu(
       stu_id number(8),
       stu_name varchar2(20),
       stu_age number(4),
       stu_schooldate date,
       stu_email varchar2(50),
       cid number(8), 
       constraint stu_id_pk primary key(stu_id)  -- 指定主键
);

在这里插入图片描述

外键约束(Foreign key)

实现两个表的关联。

create table stu(
       stu_id number(8),
       stu_name varchar2(20)  UNIQUE,
       stu_age number(4)
       constraint stu_age_nn NOT NULL,
       stu_schooldate date,
       stu_email varchar2(50),
       cid number(8),--外键
       constraint stu_id_pk  primary key(stu_id),--指定主键
       constraint stu_cls_fk foreign key(cid)  references cls(cid)--关联外键
       
);

--班级表
create table cls(
       cid number(8),--主键
       cname varchar2(20)  not null,
       constraint cls_id_pk primary key(cid)
 )

在这里插入图片描述

添加cls数据:

在这里插入图片描述

在stu表中即可实现下拉功能

在这里插入图片描述

外键关联时,cls 表称为父表,stu称为子表,子表引用父表的数据。

删除时,可以任意删除子表的数据,没有影响;但删除父表时,如果子表有关联数据,则可能删除失败。

删除父表数据的方法:

  • 删除父表时,同时删除该记录所关联的所有的子表记录(on delete cascade 级联删除)
  • 删除父表时,将子表中的外键字段设置为null(on delete set null 级联置空)

在这里插入图片描述

检查约束(Check)

要求设置某个字段的值的时候,值必须满足一定的条件。

create table stu(
       stu_id number(8),
       stu_name varchar2(20)  UNIQUE,
       stu_age number(4)
       constraint stu_age_ck check(stu_age>18),  -- check 约束
       stu_schooldate date,
       stu_email varchar2(50),
       cid number(8),
       constraint stu_id_pk  primary key(stu_id),
       constraint stu_cls_fk foreign key(cid)  references cls(cid)
);

在这里插入图片描述

新增或修改约束(add、modify)

-- 新增约束
alter table 表名称 add(constraint···)
-- 修改约束
alter table 表名称 modify(constraint···)
--修改stu表中的stu_name的唯一约束为非空约束
alter table stu modify(stu_name varchar2(20) not null)

修改后的结果(stu_name 为非空约束):

在这里插入图片描述

删除约束(drop)

drop constraint 约束的名称;
-- 删除stu 的外键约束,先用alter table指定表
alter table stu drop constraint stu_cls_fk;

在这里插入图片描述

无效化约束与激活约束

在ALTER TABLE 语句中使用 DISABLE 子句将约束无效化。

ALTER TABLE employees
DISABLE CONSTRAINT emp_id_pk;

ENABLE 子句可以将当前无效的约束激活。

ALTER TABLE employees
ENABLE CONSTRAINT emp_id_pk;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BORN(^-^)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值