修改一个表的主键:从 有主键--无主键--有主键 的过程演绎:
有效解决因为CTAS方式备份而改变表主键约束导致后期无主键的情况。
步骤如下:
--查看表emp的表结构:
SQL> desc emp;
Name Null? Type
----------------------------------------- -------- ----------------------------
EMPNO NOT NULL NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)
--查看用户下的约束:
SQL> col owner for a10;
SQL> select OWNER,CONSTRAINT_NAME
2 from user_constraints;
OWNER CONSTRAINT_NAME
---------- ------------------------------
SCOTT FK_DEPTNO
SCOTT PK_EMP
SCOTT PK_DEPT
SCOTT SYS_C0011992
SCOTT SYS_C0011993
SCOTT SYS_C0011994
SCOTT SYS_C0011995
SCOTT SYS_C0011996
SCOTT SYS_C0011997
9 rows selected.
可看到表emp的主键PK_EMP。
-- 通过CTAS方式从表emp创建表t3:
SQL> create table t3 as
2 select * from emp;
Table created.
--查看表t3表结构:
SQL> desc t3;
Name Null? Type
----------------------------------------- -------- ----------------------------
EMPNO NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)
可看到没有任何约束,只复制了表结构
-- 给表t3添加主键:
SQL> alter table t3 add constraint t3_pk primary key(empno);
Table altered.
--再次查看表t3的表结构:
SQL> desc t3;
Name Null? Type
----------------------------------------- -------- ----------------------------
EMPNO NOT NULL NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)
--再次查看用户下的约束:
SQL> select OWNER,CONSTRAINT_NAME
2 from user_constraints;
OWNER CONSTRAINT_NAME
---------- ------------------------------
SCOTT FK_DEPTNO
SCOTT T3_PK
SCOTT PK_EMP
SCOTT PK_DEPT
SCOTT SYS_C0011992
SCOTT SYS_C0011993
SCOTT SYS_C0011994
SCOTT SYS_C0011995
SCOTT SYS_C0011996
SCOTT SYS_C0011997
10 rows selected.
相比上一次,user增加了一个约束,
--查看表t3的数据:
SQL> select empno,ename
2 from emp
3 where deptno = 30;
EMPNO ENAME
---------- ----------
7499 ALLEN
7521 WARD
7654 MARTIN
7698 BLAKE
7844 TURNER
7900 JAMES
6 rows selected.
--尝试插入一条重复主键empno的数据:
SQL> insert into t3 (empno,ename) values(7900,'SUXING');
insert into t3 (empno,ename) values(7900,'SUXING')
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.T3_PK) violated
看见报错,因为主键值empno=7900重复,则添加的主键约束t3_pk生效。
--尝试插入一天主键值不重复的数据:
SQL> insert into t3 (empno,ename) values(7911,'SUXING');
1 row created.
插入成功。
由此可知,如果知道该备份方式会改变表丢失约束的情况,可以主动重新改表
添加主键,恢复表原来的表结构与约束。但不提倡经常做这样的事情。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31392094/viewspace-2126203/
,如需转载,请注明出处,否则将追究法律责任。