INSERT INTO emp2 (empno, ename, job, hiredate)
VALUES(8888,
'Mike',
'CLEANER',
TO_DATE('1970-01-01', 'yyyy-mm-dd'));
-- 插入多行:假设新建了IT部门,需要把IT部门表加到员工表中
INSERT INTO table1 (col1,col2...)
SELECT col1,col2... FROM table2
UPDATE emp2
SET empno=6666,
hiredate=SYSDATE
WHERE ename = 'Mike';
-- 工资低于水平的雇员全部加薪25%
UPDATE emp2
SET sal = 1.25*sal
WHERE sal <
(SELECT avg(sal)
FROM emp2) ;
-- DELETE
DELETE FROM table WHERE xxx;
每个连接到Oracle Server用户的进程
都称为一个Oracle的 session
每个session彼此独立不会通信,独享自己的事物控制
A会话中执行的删除操作,在其它会话中看不到此项变更,除非A COMMIT了才会同步数据
事务控制主要用两个命令:COMMIT和ROLLBACK
业务需求:银行A转账B的过程,A转给银行,银行再转给B
中途只要有一步失败(例如银行停电),就会回滚到初使状态
脏读(Dirty Read)
当一个事务读取另一个事务尚未提交的修改时,产生脏读。
同一事务内不是脏读。 一个事务开始读取了某行数据,但是另外一个事务已经更新了此数据但没有能够及时提交。这是相当危险的,因为很可能所有的操作都被回滚,也就是说读取出的数据其实是错误的。
事物隔离的实现是通过 锁机制
某个session有未提交的事务,其它session是无法更新的(进入等待状态)
增删改操作都是DML,需要commit
SAVEPOINT语句
DML操作1 SAVEPOINT sp1; DML操作2 SAVEPOINT sp2; ... ROLLBACK TO sp2
复制表结构(写个不满足的条件即可)
CREATE TABLE empnull AS
SELECT *
FROM emp
WHERE 1=0;
删除表/字段用drop,注意Oracle有回收站机制
ALTER TABLE %tablename
ADD/MODIFY (
字段1 1的类型 [可选项],
字段2 2的类型 [可选项]
);
创建数据库的流程: 删除同名表->创建表->插入测试数据->事物提交
-- 五种约束
NOT NULL -- NK
UNIQUE -- UK
PRIMARY KEY -- PK 非空+唯一
FOREIGN KEY
CHECK -- PK 增加过滤条件
-- 例子
CREATE TABLE member (
id int,
email VARCHAR(20),
sex VARCHAR(8) NOT NULL,
-- 定义约束名,使错误信息可读性更强
CONSTRAINT uk_email UNIQUE(email),
-- 复合主键,两个字段都一样才算重复,基本不用
CONSTRAINT pk_id PRIMARY kEY(id,email)
CONSTRAINT ck_sex CHECK(sex in ('male','female'))
)
一对一、一对多、多对多(多个同学选了不同的课),一般是
让学生选课名称的取值范围由另一个表绝对,这就是外键约束
create table lession(
lid int,
name VARCHAR(20) NOT NULL,
CONSTRAINT pk_lid PRIMARY KEY(lid)
);
create table student(
sid int,
name VARCHAR(20) NOT NULL,
CONSTRAINT pk_sid PRIMARY KEY(sid)
);
insert into lession values(1,'math');
insert into lession values(2,'english');
insert into lession values(1,'aa');
insert into lession values(2,'bb');
外键约束的类型有三种:
on no action:默认 A部门有人不能直接删掉A部门字段
ON DELETE set null:删掉A部门后,原A部门雇员的部门编号设为NULL
ON DELETE cascade级联 删掉A部门后同时删掉A部门所有雇员的记录
-- 如果表中存在违反年龄条件的数据
-- 则会报错,必须先处理掉非法数据
ALTER TABLE student
ADD CONSTRAINT ck_age
CHECK (age BETWEEN 16 AND 25);
ALTER TABLE student
DROP CONSTRAINT pk_mid;
如果不知道约束名,可以去查询
!> 非空约束无法增删改
Oracle没有mysql/sqlite的 AUTO_INCREMENT 关键字
Oracle通过序列或触发器实现自动自增