1.场景
在数据库迁移自动建表、用数据库可视化工具建表、或者执行的sql语句没有声明主键约束名,后期对oracle库进行主键修改是不好操作的,下面介绍两种修改方式,推荐第二种通用的。
2.一般方法
1.先查出来主键名(constraint_name)
SELECT t.*
from user_cons_columns t
where t.table_name = '表名' and t.position is not null; --表名必须大写,如:TABLE_TEST
2.删掉主键约束
ALTER TABLE 表名 DROP CONSTRAINT 主键名; -- 主键名是步骤1查出来的
3.添加新的主键约束
ALTER TABLE 表名 ADD CONSTRAINT 主键名 PRIMARY KEY(主键1,主键2,...);
以上方法不通用,因为主键约束名是系统随机生成的,每个oracle库对同一张表的主键约束名应该都是不一样的,这种方式仅适用于不用批量修改多个库的场景。
3.通用方法
1.复制原表(举例为A表),复制其数据和表结构,生成复制的表(A_COPY)
CREATE TABLE A_COPY AS SELECT * FROM A;
CREATE TABLE 新表 AS SELECT … FROM 原表 语句,可以复制原表的数据、列名、列不为空,但是不会复制主键约束、列的默认值、列的注释、表的注释等
2.删掉原表(A)
DROP TABLE A;
3.修改复制的表(A_COPY)的表名为 原表名(A)
ALTER TABLE A_COPY RENAME TO A;
4.给新的表(A)添加主键约束
ALTER TABLE A ADD CONSTRAINT 约束名 PRIMARY KEY(主键1,主键2,...);
5.给新的表(A)添加表的注释
COMMENT ON TABLE A IS '表名注释';
6.给新的表(A)添加列的注释
COMMENT ON COLUMN A.列名 IS '列注释';
7.给新的表(A)添加列的默认值
ALTER TABLE A MODIFY 列名 DEFAULT 默认值;
以上方法可以在不同的oracle库都可以通用执行