oralce操作常用操作

插入数据

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;

表已更改。
原文地址:https://www.cnblogs.com/shizhengwen/p/14672507.html