外部キーを指定していないデータベースのストアドプロシージャの名前を削除します。

データベーステーブル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_f​​kを'表をALTER')。
      SET @sql = v_sql。
      @sql FROM STMTを準備します。
      STMTをEXECUTE。
      DEALLOCATEはSTMTを準備します。
  END IF;
終わり;
//

DELIMITER;

おすすめ

転載: www.linuxidc.com/Linux/2019-07/159601.htm