插入数据
SQL> insert into dept values(50, 'App', 'Beijing'); 已创建 1 行。 SQL> select * from dept; DEPTNO DNAME LOC ---------- -------------- ------------- 50 App Beijing 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON 已选择5行。 -- 插入数据(全部字段) SQL> insert into emp values (777, 'Tom', 'SALESMAN', 7698, to_date('2016-05-02','yyyy-mm-dd'),2500,null,30) ; -- 按指定插入的数据 SQL> insert into emp(empno, ename) values (8888, 'Jerry') ;
更行数据
SQL> update emp set sal=sal*1.1 where job='CLERK' and sal<1000;
删除数据
-- 删除指定行 SQL> delete emp where ename='SCOTT'; -- 不加条件就是删除所有行 SQL> delete emp;
在insert语句中使用子查询 与 where 的值不一样就插不进去
SQL> insert into (select * from emp where deptno=10 with check option) values(66,'name', 'jjj', 100,'', 100, 100, 6); insert into (select * from emp where deptno=10 with check option) values(66,'name', 'jjj', 100,'', 100, 100, 6) * 第 1 行出现错误: ORA-01402: 视图 WITH CHECK OPTION where 子句违规 SQL> insert into (select * from emp where deptno=10 with check option) values(66,'name', 'jjj', 100,'', 100, 100, 10);
创建表结构一样的表
SQL> create table copy_emp as select * from emp where 1=0;
合并表中的数据
SQL> merge into copy_emp c using emp e on (c.empno=e.empno) when matched then update set c.ename=e.ename, c.job=e.job, c.mgr=e.mgr, c.hiredate=e.hiredate, c.sal=e.sal, c.comm=e.comm, c.deptno=e.deptno when not matched then insert values( e.empno, e.ename, e.job, e.mgr, e.hiredate, e.sal, e.comm, e.deptno );
事物
savepoint 是保存点
SQL> select * from aaa; X NAME ---------- ------------ 1990 Stella 已选择 1 行。 SQL> insert into aaa values(1,'X'); 已创建 1 行。 SQL> savepoint a1; 保存点已创建。 SQL> insert into aaa values(1,'Y'); 已创建 1 行。 SQL> savepoint a2; 保存点已创建。 SQL> update aaa set x=2 where name='Y'; 已更新 1 行。 SQL> savepoint a3; 保存点已创建。 SQL> insert into aaa values(3,'A'); 已创建 1 行。 SQL> select * from aaa; X NAME ---------- ------------ 1990 Stella 1 X 2 Y 3 A 已选择4行。
上面建好了数据和保持点,现在开始回退了
SQL> rollback to a3; 回退已完成。 SQL> select * from aaa; X NAME ---------- ------------ 1990 Stella 1 X 2 Y 已选择3行。 SQL> rollback to a2; 回退已完成。 SQL> select * from aaa; X NAME ---------- ------------ 1990 Stella 1 X 1 Y 已选择3行。 SQL> rollback to a1; 回退已完成。 SQL> select * from aaa; X NAME ---------- ------------ 1990 Stella 1 X 已选择2行。 SQL> roll 回退已完成。 SQL> select * from aaa; X NAME ---------- ------------ 1990 Stella 已选择 1 行。
约束
not null -- 非空约束, 这一列不允许有空值 unique -- 唯一约束, 这一列不允许有重复的值 primary key -- 主键约束, 一张表只能有一个主键,不能有空值和重复的值 foreign key -- 外键约束, 只能参照主键建立外键 check -- 数据约束, 设置插入值的范围
使用
SQL> create table t03(id number(3) not null); 表已创建。 -- 查看库中有哪些约束 SQL> desc user_constraints 名称 是否为空? 类型 ----------------------------------------- -------- ---------------------------- OWNER VARCHAR2(30) CONSTRAINT_NAME NOT NULL VARCHAR2(30) CONSTRAINT_TYPE VARCHAR2(1) TABLE_NAME NOT NULL VARCHAR2(30) SEARCH_CONDITION LONG R_OWNER VARCHAR2(30) R_CONSTRAINT_NAME VARCHAR2(30) DELETE_RULE VARCHAR2(9) STATUS VARCHAR2(8) DEFERRABLE VARCHAR2(14) DEFERRED VARCHAR2(9) VALIDATED VARCHAR2(13) GENERATED VARCHAR2(14) BAD VARCHAR2(3) RELY VARCHAR2(4) LAST_CHANGE DATE INDEX_OWNER VARCHAR2(30) INDEX_NAME VARCHAR2(30) INVALID VARCHAR2(7) VIEW_RELATED VARCHAR2(14) -- 查看T03 的约束有哪些 SQL> select CONSTRAINT_NAME, CONSTRAINT_TYPE,SEARCH_CONDITION FROM USER_CONSTRAINTS WHERE TABLE_NAME='T03'; CONSTRAINT_NAME C ------------------------------ - SEARCH_CONDITION -------------------------------------------------------------------------------- SYS_C0011103 C "ID" IS NOT NULL
重新创建 t03 表,给约束取名字
SQL> drop table T03 purge; 表已删除。 -- 用 constraint 给外键取名字 SQL> create table t03(id number(3) constraint nn_t03_id not null); 表已创建。 SQL> select CONSTRAINT_NAME, CONSTRAINT_TYPE,SEARCH_CONDITION FROM USER_CONSTRAINTS WHERE TABLE_NAME='T03'; CONSTRAINT_NAME C ------------------------------ - SEARCH_CONDITION -------------------------------------------------------------------------------- NN_T03_ID C "ID" IS NOT NULL
增加唯一约束
-- 增加 name 字段给 t03 SQL> alter table t03 add(name varchar2(10)); 表已更改。 -- 查看 t03 的表字段已经创建了 SQL> desc t03; 名称 是否为空? 类型 ----------------------------------------- -------- ---------------------------- ID NOT NULL NUMBER(3) NAME VARCHAR2(10) -- 给 t03 的 name 字段加上唯一索引 SQL> alter table t03 add constraint uk_t03_name unique(name); 表已更改。 SQL> col SEARCH_CONDITION for a30 -- 这时查看表中的约束 就出来了 SQL> select CONSTRAINT_NAME, CONSTRAINT_TYPE,SEARCH_CONDITION FROM USER_CONSTRAINTS WHERE TABLE_NAME='T03'; CONSTRAINT_NAME C SEARCH_CONDITION ------------------------------ - ------------------------------ NN_T03_ID C "ID" IS NOT NULL UK_T03_NAME U
增加主键约束
SQL> create table t01(id number(4), name varchar2(15)); 表已创建。 SQL> desc t01 名称 是否为空? 类型 ----------------------------------------- -------- ---------------------------- ID NUMBER(4) NAME VARCHAR2(15) -- 增加主键约束 SQL> alter table t01 add constraint pk_t01_id primary key (id); 表已更改。 -- 这时主键约束被加上去了 SQL> select CONSTRAINT_NAME, CONSTRAINT_TYPE,SEARCH_CONDITION FROM USER_CONSTRAINTS WHERE TABLE_NAME='T01'; CONSTRAINT_NAME C SEARCH_CONDITION ------------------------------ - ------------------------------ PK_T01_ID P
外键约束
-- 给 t03 id这段添加外键 参照 t01 表 SQL> alter table t03 add constraint fk_t03_id foreign key (id) references t01; 表已更改。 -- 这时 外键约束已经加上去了 SQL> select CONSTRAINT_NAME, CONSTRAINT_TYPE,SEARCH_CONDITION FROM USER_CONSTRAINTS WHERE TABLE_NAME='T03'; CONSTRAINT_NAME C SEARCH_CONDITION ------------------------------ - ------------------------------ NN_T03_ID C "ID" IS NOT NULL UK_T03_NAME U FK_T03_ID R
在刚建好的外键上插入数据
SQL> insert into t01 values(1,'a'); 已创建 1 行。 SQL> insert into t03 values(1,'tom'); 已创建 1 行。 SQL> insert into t03 values(1,'Irving'); 已创建 1 行。
删除主键,级联
-- 碰见了外键约束无法删除 SQL> delete t01; delete t01 * 第 1 行出现错误: ORA-02292: 违反完整约束条件 (SCOTT.FK_T03_ID) - 已找到子记录 -- 把t03外键约束删掉 SQL> alter table t03 drop constraint FK_T03_ID; 表已更改。 -- 换上了新的外键约束,这次换上的是级联删除约束 SQL> alter table t03 add constraint fk_t03_id foreign key (id) references t01 on delete cascade; 表已更改。 -- 测试一下删除数据 SQL> delete t01; 已删除 1 行。
check 约束
SQL> alter table emp add constraint ch_emp_sal check (sal>=800); 表已更改。 SQL> insert into emp (empno,ename,sal)values(1,'tom',700); insert into emp (empno,ename,sal)values(1,'tom',700) * 第 1 行出现错误: ORA-02290: 违反检查约束条件 (SCOTT.CH_EMP_SAL)
修改约束 给建好的表也想启用非空约束
SQL> alter table t03 modify (id number not null); 表已更改。
删除约束
SQL> select CONSTRAINT_NAME, CONSTRAINT_TYPE,SEARCH_CONDITION FROM USER_CONSTRAINTS WHERE TABLE_NAME='T03'; CONSTRAINT_NAME C SEARCH_CONDITION ------------------------------ - ------------------------------ SYS_C0011111 C "ID" IS NOT NULL UK_T03_NAME U FK_T03_ID R SQL> alter table t03 drop constraint SYS_C0011111; 表已更改。
禁止约束
-- 禁用 check 约束 SQL> alter table emp modify constraint CH_EMP_SAL disable; 表已更改。 -- 禁用后 700 就能插进去 SQL> insert into emp (empno,ename,sal)values(1,'tom',700); 已创建 1 行。 -- 恢复约束,由于插入的700不符合约束,所以插不进去 SQL> alter table emp modify constraint CH_EMP_SAL enable; alter table emp modify constraint CH_EMP_SAL enable * 第 1 行出现错误: ORA-02293: 无法验证 (SCOTT.CH_EMP_SAL) - 违反检查约束条件 -- 要想插入时不检测老数据,只想对新数据插入时校验加上 novalidate SQL> alter table emp modify constraint CH_EMP_SAL enable novalidate; 表已更改。