前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >删除数据库中未指定名称的外键的存储过程

删除数据库中未指定名称的外键的存储过程

作者头像
星哥玩云
发布2022-08-18 15:49:36
1.3K0
发布2022-08-18 15:49:36
举报
文章被收录于专栏:开源部署

数据库中的某个表A,因为业务原因被移到别的库。麻烦的是,有几张子表(B, C, D等)建有指向它的外键,而且在创建时没有指定统一的外键名。如此一来,在不同的环境(开发、测试、生产等)中该外键的名称不一样,必须逐个去查询外键名再进行删除,十分不便。

为此,特地编写了一个存储过程,只须指定子表名(B,C,D)和外键的列名,直接调用该存储过程即可。

Oracle的存储过程代码如下:

-- 删除指定表、指定列上的外键(系统命名或未知名) 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的代码如下:

-- 删除指定表、指定列上的外键(系统命名或未知名) 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的代码如下:

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 ;

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Oracle的存储过程代码如下:
  • PostgreSql的代码如下:
  • MySQL的代码如下:
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档