我正在搜索查询或我可以导出数据库中所有主键的方式
我有超过1000多个主键。
我可以用这种方式
select ' alter table '''||tab1||''' add constraint '''||constraint_name|||''' primary key values ( '''||columns||''' ') from user_cons_tables
但上面的问题是我无法添加更多的一列
答案 0 :(得分:3)
如果您使用的是11g且可以使用listagg
功能,则可以使用该功能。我不知道你的例子中user_cons_tables
是什么,但我认为这就是你想要的:
select ' alter table "' || uc.table_name || '" add constraint "'
||uc.constraint_name||'" primary key ('||
listagg('"' || column_name || '"', ',') within group (order by ucc.position)
|| ')' as alter_statement
from user_constraints uc
join user_cons_columns ucc on ucc.constraint_name = uc.constraint_name
where uc.constraint_type = 'P'
group by uc.table_name, uc.constraint_name;
但为什么要推出自己的?您可以改为使用dbms_metadata
:
select dbms_metadata.get_ddl('CONSTRAINT', uc.constraint_name)
from user_constraints uc
where uc.constraint_type = 'P';
您可能需要进行一些转换以移除存储空间等,正如我在小提琴中所示。
答案 1 :(得分:3)
使用DBMS_METADATA包:
SQL> col x format a100
SQL> select dbms_metadata.get_ddl('CONSTRAINT', constraint_name) x
2 from user_constraints where constraint_type = 'P' and rownum <= 2
3 /
X
--------------------------------------------------------------------------------
ALTER TABLE "SCOTT"."TEST_TAB" ADD PRIMARY KEY ("X")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
TABLESPACE "USERS" ENABLE
ALTER TABLE "SCOTT"."T" ADD PRIMARY KEY ("ID", "NAME")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS" ENABLE