1.场景

在数据库迁移自动建表、用数据库可视化工具建表、或者执行的sql语句没有声明主键约束名,后期对oracle库进行主键修改是不好操作的,下面介绍两种修改方式,推荐第二种通用的。

2.一般方法

1.先查出来主键名(constraint_name)

  1. SELECT t.*
  2. from user_cons_columns t
  3. where t.table_name = '表名' and t.position is not null; --表名必须大写,如:TABLE_TEST

2.删掉主键约束

  1. ALTER TABLE 表名 DROP CONSTRAINT 主键名; -- 主键名是步骤1查出来的

3.添加新的主键约束

  1. ALTER TABLE 表名 ADD CONSTRAINT 主键名 PRIMARY KEY(主键1,主键2,...);

以上方法不通用,因为主键约束名是系统随机生成的,每个oracle库对同一张表的主键约束名应该都是不一样的,这种方式仅适用于不用批量修改多个库的场景。

3.通用方法

1.复制原表(举例为A表),复制其数据和表结构,生成复制的表(A_COPY)

  1. CREATE TABLE A_COPY AS SELECT * FROM A;

CREATE TABLE 新表 AS SELECT … FROM 原表 语句,可以复制原表的数据、列名、列不为空,但是不会复制主键约束、列的默认值、列的注释、表的注释等
2.删掉原表(A)

  1. DROP TABLE A;

3.修改复制的表(A_COPY)的表名为 原表名(A)

  1. ALTER TABLE A_COPY RENAME TO A;

4.给新的表(A)添加主键约束

  1. ALTER TABLE A ADD CONSTRAINT 约束名 PRIMARY KEY(主键1,主键2,...);

5.给新的表(A)添加表的注释

  1. COMMENT ON TABLE A IS '表名注释';

6.给新的表(A)添加列的注释

  1. COMMENT ON COLUMN A.列名 IS '列注释';

7.给新的表(A)添加列的默认值

  1. ALTER TABLE A MODIFY 列名 DEFAULT 默认值;

以上方法可以在不同的oracle库都可以通用执行