Delete the database stored procedure name does not specify a foreign key

A database table A, since the business was moved to reasons other libraries. The trouble is, there are several sub-tables (B, C, D, etc.) has a foreign key to it, and there is no unified foreign key name specified at creation time. Thus, the name of the foreign key is not the same in different environments (development, test, production, etc.), it is necessary to query-by-name foreign keys and then delete, very inconvenient.

For this purpose, specially prepared by a stored procedure, only the specified sub-list name (B, C, D) and the foreign key column name of the stored procedure can be called directly.

The stored procedure code is as follows:

-- 删除指定表、指定列上的外键(系统命名或未知名)
CREATE OR REPLACE PROCEDURE DROP_FK(P_TABLE IN VARCHAR2, P_COLUMN IN VARCHAR2)
AS
  v_fk varchar2(100);
  v_sql varchar2(1000);
BEGIN
  SELECT A.CONSTRAINT_NAME INTO v_fk FROM USER_CONS_COLUMNS A, USER_CONSTRAINTS B
  WHERE  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;
  EXECUTE IMMEDIATE v_sql;
EXCEPTION
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('发生错误'||SQLCODE||':'||SQLERRM);
END DROP_FK;
/

PostgreSql code is as follows:

-- 删除指定表、指定列上的外键(系统命名或未知名)
CREATE OR REPLACE FUNCTION DROP_FK(P_TABLE IN VARCHAR, P_COLUMN IN VARCHAR)
RETURNS void AS $$
  DECLARE v_fk  VARCHAR(100);
  DECLARE v_sql VARCHAR(1000);
BEGIN
  SELECT tc.constraint_name INTO v_fk
  FROM information_schema.table_constraints AS tc, information_schema.key_column_usage AS kcu
  WHERE tc.table_name = lower(P_TABLE) AND kcu.column_name=lower(P_COLUMN)
    AND constraint_type = 'FOREIGN KEY' AND tc.constraint_name = kcu.constraint_name;
  v_sql := 'ALTER TABLE '|| P_TABLE ||' DROP CONSTRAINT '|| v_fk;
  EXECUTE v_sql;
EXCEPTION
  WHEN OTHERS THEN
    RAISE EXCEPTION '(%)', SQLERRM;
END;
$$ LANGUAGE plpgsql;

MySQL code as follows:

DELIMITER //

DROP PROCEDURE IF EXISTS drop_fk//

-- 删除指定表、指定列上的外键(系统命名或未知名)
CREATE PROCEDURE drop_fk(IN P_TABLE VARCHAR(100), IN P_COLUMN VARCHAR(100)) LANGUAGE SQL
BEGIN
  DECLARE v_fk  VARCHAR(100);
  DECLARE v_sql VARCHAR(1000);
  DECLARE v_cnt INT;
 
  SELECT count(*) INTO v_cnt
  FROM information_schema.table_constraints TC, information_schema.key_column_usage TCU
  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;
  IF v_cnt=1 THEN
      SELECT TC.CONSTRAINT_NAME INTO v_fk
      FROM information_schema.table_constraints TC, information_schema.key_column_usage TCU
      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('ALTER TABLE ', P_TABLE, ' DROP FOREIGN KEY ', v_fk);
      SET @sql = v_sql;
      PREPARE stmt FROM @sql;
      EXECUTE stmt;
      DEALLOCATE PREPARE  stmt;
  END IF;
END;
//

DELIMITER ;

Guess you like

Origin www.linuxidc.com/Linux/2019-07/159601.htm