データベーステーブルA、事業が理由の他のライブラリに移動してから。トラブルがいくつかのサブテーブル(B、C、Dなど)それへの外部キーを持っているがあり、であり、作成時に指定された統一外部キー名はありません。このように、外部キーの名前が異なる環境(開発、テスト、本番など)には同じではありませんが、外部キーをすることにより、名前照会してから削除することは非常に不便必要です。
この目的のために、特別にのみ指定されたサブリストの名前(B、C、D)と、ストアドプロシージャの外部キー列名を直接呼び出すことができ、格納されている手順により調製。
ストアドプロシージャのコードは次の通りであります:
-删除指定表、指定列上的外键(系统命名或未知名)
CREATE OR(VARCHAR2 IN P_TABLE、VARCHAR2 IN P_COLUMN)PROCEDURE DROP_FKをREPLACE
AS
v_fk VARCHAR2(100)。
v_sql VARCHAR2(1000);
BEGIN
USER_CONS_COLUMNS A、USER_CONSTRAINTS Bからv_fk INTO SELECT A.CONSTRAINT_NAMEを
A.TABLE_NAME = UPPER(P_TABLE)AND A.COLUMN_NAME = UPPER(P_COLUMN)
AND B.TABLE_NAME = UPPER(P_TABLE)AND B.CONSTRAINT_TYPE = 'R'
AND A .CONSTRAINT_NAME = B.CONSTRAINT_NAME。
v_sql:= 'のALTER TABLE' || P_TABLE ||」DROP CONSTRAINTの「|| v_fk;
IMMEDIATE v_sqlをEXECUTE。
EXCEPTION
OTHERS THEN
DBMS_OUTPUT.PUT_LINE( '发生错误' || SQLCODE || '' || SQLERRM)。
END DROP_FK;
/
次のようにPostgreSQLのコードは次のとおりです。
-删除指定表、指定列上的外键(系统命名或未知名)
CREATE OR REPLACE FUNCTIONのDROP_FK(VARCHAR、IN VARCHAR、P_COLUMN、IN P_TABLEは)
$$ AS voidを返す
のDECLARE v_fk VARCHAR(100);
v_sql VARCHAR(1000)を宣言します。
BEGIN
v_fk INTO SELECT tc.constraint_nameを
TC、KCU AS information_schema.key_column_usage AS information_schema.table_constraints FROM
(P_COLUMN)下部= tc.table_nameが低い=(P_TABLE)AND kcu.column_name
AND CONSTRAINT_TYPE = 'FOREIGN KEY' AND tc.constraint_name = KCU .constraint_name;
v_sql:= 'のALTER TABLE' || P_TABLE ||」DROP CONSTRAINTの「|| v_fk;
v_sqlをEXECUTE。
EXCEPTION
OTHERS次いで
EXCEPTION '(%)'、SQLERRMを上げます。
終わり;
$$ LANGUAGEのplpgsqlが、
MySQLのコードは次のよう:
DELIMITER //
DROP PROCEDURE IFはdrop_fk EXISTS //
-删除指定表、指定列上的外键(系统命名或未知名)
(P_COLUMN VARCHAR(100)IN P_TABLE VARCHAR(100)、IN)CREATE PROCEDUREのdrop_fk言語SQL
BEGIN
DECLAREのv_fk VARCHAR(100)。
v_sql VARCHAR(1000)を宣言します。
v_cntのINTを宣言。
SELECT COUNT(*)v_cnt INTO
information_schema.table_constraints FROM TC、TCU information_schema.key_column_usage
WHERE TC.TABLE_NAME = LOWER(P_TABLE)AND TCU.TABLE_NAME = LOWER(P_TABLE)
AND CONSTRAINT_TYPE = 'FOREIGN KEY' AND COLUMN_NAME = LOWER(P_COLUMN)
AND TC.CONSTRAINT_NAME = TCU.CONSTRAINT_NAME。
v_cnt = 1 THEN IF
v_fk INTO TC.CONSTRAINT_NAMEを選択
information_schema.table_constraints TC FROM、TCUをinformation_schema.key_column_usage
WHERE TC.TABLE_NAME = LOWER(P_TABLE)AND TCU.TABLE_NAME = LOWER(P_TABLE)
AND CONSTRAINT_TYPE = 'FOREIGN KEY' AND COLUMN_NAME = LOWER(P_COLUMN)
AND TC.CONSTRAINT_NAME = TCU.CONSTRAINT_NAME。
SETのv_sql = CONCAT(P_TABLE、 'DROP FOREIGN KEY'、v_fkを'表をALTER')。
SET @sql = v_sql。
@sql FROM STMTを準備します。
STMTをEXECUTE。
DEALLOCATEはSTMTを準備します。
END IF;
終わり;
//
DELIMITER;