【Tips】使用SQL生成外來鍵的SQL建立語句

secooler發表於2010-01-18
僅需簡單的理清思路便可從USER_CONSTRAINTS和USER_CONS_COLUMNS檢視中獲得建立外來鍵的必要資訊,進而可以按需生成自己需要微調的外來鍵建立指令碼。
例如想批次生成帶有“on delete cascade”屬性的外來鍵調整語句時,SQL建立的方法是一個比較靈活手段。

1.直接了當,指令碼如下
select    'alter table '
       || a.table_name
       || ' add constraint '
       || a.constraint_name
       || ' foreign key ('
       || c.column_name
       || ') references '
       || b.table_name
       || ' ('
       || b.column_name
       || ');'
          as "Foreing Key SQL"
  from USER_CONSTRAINTS A, USER_CONS_COLUMNS B, USER_CONS_COLUMNS C
 where A.R_CONSTRAINT_NAME = B.CONSTRAINT_NAME
   and A.CONSTRAINT_NAME = C.CONSTRAINT_NAME
   and A.TABLE_NAME = C.TABLE_NAME
   and B.POSITION = C.POSITION
   and A.TABLE_NAME = '&Table_Name'
/

2.演示一下指令碼使用效果
沿用《【Analytic】使用分析函式ROW_NUMBER輔助完成外來鍵的索引批次建立》http://space.itpub.net/519536/viewspace-625326中的主外來鍵表的例子演示一下指令碼的效果。
sec@ora10g> select    'alter table '
  2         || a.table_name
  3         || ' add constraint '
  4         || a.constraint_name
  5         || ' foreign key ('
  6         || c.column_name
  7         || ') references '
  8         || b.table_name
  9         || ' ('
 10         || b.column_name
 11         || ');'
 12            as "Foreing Key SQL"
 13    from USER_CONSTRAINTS A, USER_CONS_COLUMNS B, USER_CONS_COLUMNS C
 14   where A.R_CONSTRAINT_NAME = B.CONSTRAINT_NAME
 15     and A.CONSTRAINT_NAME = C.CONSTRAINT_NAME
 16     and A.TABLE_NAME = C.TABLE_NAME
 17     and B.POSITION = C.POSITION
 18     and A.TABLE_NAME = '&Table_Name'
 19  /
Enter value for table_name: T_CHILD
old  18:    and A.TABLE_NAME = '&Table_Name'
new  18:    and A.TABLE_NAME = 'T_CHILD'

Foreing Key SQL
-----------------------------------------------------------------------------------------------------------
alter table T_CHILD add constraint FK_T_CHILD_01 foreign key (COL1_CHILD) references T_PARENT (COL_PARENT);
alter table T_CHILD add constraint FK_T_CHILD_02 foreign key (COL2_CHILD) references T_PARENT (COL_PARENT);

3.對比一下使用“dbms_metadata.get_ddl”方法獲得外來鍵約束的結果
sec@ora10g> select dbms_metadata.get_ddl('TABLE','&Table_Name') as "Create table DDL" from dual;
Enter value for table_name: T_CHILD
old   1: select dbms_metadata.get_ddl('TABLE','&Table_Name') as "Create table DDL" from dual
new   1: select dbms_metadata.get_ddl('TABLE','T_CHILD') as "Create table DDL" from dual

Create table DDL
-------------------------------------------------------------------------

  CREATE TABLE "SEC"."T_CHILD"
   (    "COL1_CHILD" NUMBER(*,0),
        "COL2_CHILD" NUMBER(*,0),
         CONSTRAINT "FK_T_CHILD_01" FOREIGN KEY ("COL1_CHILD")
          REFERENCES "SEC"."T_PARENT" ("COL_PARENT") ENABLE,
         CONSTRAINT "FK_T_CHILD_02" FOREIGN KEY ("COL2_CHILD")
          REFERENCES "SEC"."T_PARENT" ("COL_PARENT") ENABLE
   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "TBS_SEC_D"

外來鍵約束內容與我們組織的SQL內容一致。當然可以進一步對指令碼進行調整,生成帶有“on delete cascade”屬性的外來鍵建立語句(這個小任務留給大家當家庭作業啦)。

4.小結
在遇到具體需求的時候,不要盲目的鑽牛角尖,首先想一想有沒有便捷的手段來完成。

Good luck.

secooler
10.01.18

-- The End --

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/519536/viewspace-625455/,如需轉載,請註明出處,否則將追究法律責任。

相關文章