【Tips】使用SQL生成外來鍵的SQL建立語句
僅需簡單的理清思路便可從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 --
例如想批次生成帶有“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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql建立外來鍵語句MySql
- 【SQLLDR】使用SQL*Loader輔助生成外部表建立語句SQL
- Java中如何解析SQL語句、格式化SQL語句、生成SQL語句?JavaSQL
- sql語句建立表SQL
- SQL外來鍵約束的含義及建立SQL
- jsqlparser使用記錄---生成sql語句JSSQL
- 使用hint來調優sql語句SQL
- 4.3.2 關於使用SQL語句建立CDBSQL
- sql語句建立日曆SQL
- (轉)oracle資料庫中所有外來鍵約束失效SQL語句Oracle資料庫SQL
- 【PL/SQL】使用變數傳遞方法生成表更名的SQL語句SQL變數
- Laravel 使用 sql 語句 和 sql 檔案 來建立執行資料庫遷移LaravelSQL資料庫
- 【Tips】使用SQL生成SQL技巧備份表資料SQL
- sql 中的with 語句使用SQL
- SQL語句圖表生成工具ChartSQLSQL
- SQL的主鍵和外來鍵約束SQL
- 【轉義】使用SQL生成SQL語句時單引號的轉義處理SQL
- oracle檢視當前使用者下所有外來鍵、主鍵、索引、sequence的建立語句Oracle索引
- Oracle 外來鍵查詢sqlOracleSQL
- 一些sql語句的關鍵詞SQL
- 定時生成分月表sql語句SQL
- 根據DELTA自動生成SQL語句SQL
- SQL語句SQL
- EFCore常規操作生成的SQL語句一覽SQL
- 使用sql語句查詢平均值,使用sql語句查詢資料總條數, not in 篩選語句的使用SQL
- 【SQL】10 SQL UPDATE 語句SQL
- 【SQL】11 SQL DELETE 語句SQLdelete
- sql最佳化:使用sql profile最佳化sql語句SQL
- SQL語句IN的用法SQL
- 常用的SQL語句SQL
- 常用的SQL 語句SQL
- SQL 語句 as 的用法SQL
- oracle的sql語句OracleSQL
- 使用sql語句分析雙色球SQL
- SQL語句使用總結(一)SQL
- SQL查詢語句使用 (轉)SQL
- 使用mysqlsniffer捕獲SQL語句MySql
- 常見的SQL語句(建立、刪除、切換)SQL