达梦使用存储过程实现删除重复记录、判断并添加主键和自增列的逻辑

news2025/6/9 22:08:18

在达梦数据库中,要确保主键的唯一性约束,可以在存储过程的最前面添加删除重复记录的逻辑。以下是一个完整的存储过程,包含删除重复记录、判断并添加主键和自增列的逻辑:

存储过程示例

-- 切换到指定模式;schema_name   是目标模式的名称
SET SCHEMA  schema_name; 

CREATE OR REPLACE PROCEDURE AddPrimaryKeyAndAutoIncrement (
    p_table_name IN VARCHAR2,
    p_column_name IN VARCHAR2
)
IS
    v_pk_exists BOOLEAN := FALSE;
    v_auto_increment_exists BOOLEAN := FALSE;
BEGIN
    -- 删除重复记录,确保主键唯一约束
    EXECUTE IMMEDIATE 'DELETE FROM ' || p_table_name || ' WHERE ' || p_column_name || ' NOT IN (' ||
                      'SELECT ' || p_column_name || ' FROM ' || p_table_name || ' GROUP BY ' || p_column_name || ' HAVING COUNT(*) = 1)';
   PRINT '表 ' || p_table_name || ' 的重复记录已删除';

    -- 检查主键是否存在
    SELECT CASE WHEN COUNT(*) > 0 THEN TRUE ELSE FALSE END INTO v_pk_exists
    FROM USER_CONSTRAINTS
    WHERE TABLE_NAME = UPPER(p_table_name) AND CONSTRAINT_TYPE = 'P';

    -- 检查自增列是否存在
    SELECT CASE WHEN COUNT(*) > 0 THEN TRUE ELSE FALSE END INTO v_auto_increment_exists
    FROM SYS.SYSCOLUMNS a
    JOIN SYS.SYSOBJECTS b ON a.id = b.id
    WHERE b.NAME = UPPER(p_table_name)
    AND a.NAME = UPPER(p_column_name)
    AND a.info2 = 1; -- 判断是否为自增列

    -- 根据判断结果执行添加操作
    IF NOT v_pk_exists THEN
        -- EXECUTE IMMEDIATE 'ALTER TABLE ' || p_table_name || ' ADD CONSTRAINT PK_' || p_table_name || ' PRIMARY KEY (' || p_column_name || ')';
        EXECUTE IMMEDIATE 'ALTER TABLE ' || p_table_name || ' ADD PRIMARY KEY (' || p_column_name || ')';
        PRINT  '表 ' || p_table_name || ' 的主键已添加';
    ELSE
        DBMS_OUTPUT.PUT_LINE('表 ' || p_table_name || ' 的主键已存在');
    END IF;

    IF NOT v_auto_increment_exists THEN
        -- EXECUTE IMMEDIATE 'ALTER TABLE ' || p_table_name || ' MODIFY ' || p_column_name || ' INT IDENTITY(1, 1)';
        EXECUTE IMMEDIATE 'ALTER TABLE ' || p_table_name || ' ADD COLUMN  ' || p_column_name || '  IDENTITY(1, 1)';
        PRINT '表 ' || p_table_name || ' 的自增已添加';
    ELSE
        PRINT '表 ' || p_table_name || ' 的自增已存在';
    END IF;
END;
/

说明

• 删除重复记录:在存储过程的最前面,执行DELETE语句删除表中重复的记录。这一步确保了主键唯一性约束。

• 检查主键:通过查询USER_CONSTRAINTS视图判断主键是否已经存在。

• 检查自增列:通过查询SYS.SYSCOLUMNSSYS.SYSOBJECTS视图判断列是否为自增列。

• 添加主键和自增:根据检查结果,动态执行ALTER TABLE语句添加主键和自增属性。

调用存储过程
可以为不同的表调用此存储过程:

EXEC AddPrimaryKeyAndAutoIncrement('YOUR_TABLE_NAME', 'YOUR_COLUMN_NAME');
-- 或者
CALL AddPrimaryKeyAndAutoIncrement('YOUR_TABLE_NAME', 'YOUR_COLUMN_NAME');

在达梦数据库中,可以使用DROP PROCEDURE语句来删除存储过程。以下是删除之前创建的存储过程AddPrimaryKeyAndAutoIncrement的SQL语句:

DROP PROCEDURE IF EXISTS AddPrimaryKeyAndAutoIncrement;

执行上述语句后,存储过程AddPrimaryKeyAndAutoIncrement将被删除。

注意事项

• 备份数据:在执行删除操作之前,建议备份数据以防误删。

• 权限问题:确保执行此存储过程的用户具有足够的权限。

• 表名和列名大小写:在达梦数据库中,表名和列名通常区分大小写,因此在查询时要确保大小写一致。

通过以上方法,可以确保表中主键的唯一性,并根据需要添加主键和自增列。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2405895.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

词法分析和词性标注 自然语言处理

目录 一. 概述 1 不同语言的词法分析 2 英语的形态分析 英语单词的形态还原(和正常英语的词法变化一样) 1.有规律变化单词的形态还原 ​编辑 2.动词、名词、形容词、副词不规则变化单词的形态还原 3.对于表示年代&…

QT聊天项目DAY14

1. 客户端登录 1.1 初始化玩家头像 将头像的大小固定在250 * 250 void InitHeadImage(); // 初始化头像/* 初始化头像 */ void LoginWidget::InitHeadImage() {// 加载头像QPixmap OriginalPixmap(":/Chat/Images/head_5.jpg");OriginalPixmap …

架构设计技巧——架构设计模板

一份实用、高效、覆盖核心要素的架构设计模板是确保设计质量、促进团队沟通和指导实施的关键。以下是一个经过提炼的架构设计文档核心模板框架,结合了业界最佳实践,并强调灵活裁剪: 架构设计文档模板 (核心框架) 文档标识 项目/系统名称&a…

【Ragflow】27.RagflowPlus(v0.4.1):小版本迭代,问题修复与功能优化

概述 RagflowPlus v0.4.0 在发布后,收到了积极的反馈,同时也包含一些问题。 本次进行一轮小版本更新,发布 v0.4.1 版本,对已知问题进行修复,并对部分功能进行进一步优化。 开源地址:https://github.com/…

【Oracle】数据仓库

个人主页:Guiat 归属专栏:Oracle 文章目录 1. 数据仓库概述1.1 为什么需要数据仓库1.2 Oracle数据仓库架构1.3 Oracle数据仓库关键技术 2. 数据仓库建模2.1 维度建模基础2.2 星形模式设计2.3 雪花模式设计2.4 缓慢变化维度(SCD)处…

基于开源AI大模型AI智能名片S2B2C商城小程序源码的中等平台型社交电商运营模式研究

摘要:本文聚焦中等平台型社交电商,探讨其与传统微商及大型社交电商平台的差异,尤其关注产品品类管理对代理运营的影响。通过引入开源AI大模型、AI智能名片与S2B2C商城小程序源码技术,构建智能化运营体系。研究结果表明&#xff0c…

Vite 双引擎架构 —— Esbuild 概念篇

Vite 底层采用 双引擎架构,核心构建引擎是 Esbuild 和 Rollup,二者在开发和生产环境中分工协作,共同实现高性能构建。不可否认,作为 Vite 的双引擎之一,Esbuild 在很多关键的构建阶段(如依赖预编译、TS 语法转译、代码…

阿里云Alibaba Cloud安装Docker与Docker compose【图文教程】

个人记录 进入控制台,找到定时与自动化任务 进入‘安装/卸载扩展程序’ 点击‘安装扩展程序’ 选择docker社区版,点击下一步与确定,等待一会 安装成功 查询版本 查询docker sudo docker version查询docker compose sudo docker compo…

ADB识别手机系统弹授权框-如何处理多重弹框叠加和重叠问题

ADB识别手机系统弹授权框-如何处理多重弹框叠加和重叠问题 --蓝牙电话SDK自动部署 上一篇:手机App-插入USB时自动授权点击确定按钮-使系统弹出框自动消失 下一篇:编写中。 一、前言 我们在上一篇《手机App-插入USB时自动授权点击确定按钮-使系统弹出框…

uniapp+<script setup lang=“ts“>解决有数据与暂无数据切换显示,有数据加载时暂无数据闪现(先加载空数据)问题

声明showEmpty 为false&#xff0c;在接口返回处判断有数据时设置showEmpty 为false&#xff0c;接口返回数据为空则判断showEmpty 为true &#xff08;这样就解决有数据的时候会闪现暂无数据的问题啦&#xff09; <!--* Date: 2024-02-26 03:38:52* LastEditTime: 2025-06…

详解鸿蒙Next仓颉开发语言中的动画

大家上午好&#xff0c;今天来聊一聊仓颉开发语言中的动画开发。 仓颉中的动画通常有两种方式&#xff0c;分别是属性动画和显示动画&#xff0c;我们今天以下面的加载动画为例&#xff0c;使用显示动画和属性动画分别实现一下&#xff0c;看看他们有什么区别。 显示动画 显示…

Redis常见使用场景解析

1. 数据库缓存 Redis 作为典型的 Key-Value 型内存数据库,数据缓存是其最广为人知的应用场景。使用 Redis 缓存数据操作简便,通常将序列化后的对象以 string 类型存储。但在实际应用中,需注意以下关键要点: Key 设计:必须确保不同对象的 Key 具有唯一性,且尽量缩短长度,…

起重机指挥人员在工作中需要注意哪些安全事项?

起重机指挥人员在作业中承担着协调设备运行、保障作业安全的关键职责&#xff0c;其安全操作直接关系到整个起重作业的安全性。以下从作业前、作业中、作业后的全流程&#xff0c;详细说明指挥人员需注意的安全事项&#xff1a; 一、作业前的安全准备 资质与状态检查&#xff…

JAVA-springboot log日志

SpringBoot从入门到精通-第8章 日志的操作 一、Spring Boot默认的日志框架 SpringBoot支持很多种日志框架&#xff0c;通常情况下&#xff0c;这些日志框架都是由一个日志抽象层和一个日志实现层搭建而成的&#xff0c;日志抽象层是为记录日志提供的一套标准且规范的框架&…

1.springmvc基础入门(一)

1.Spring MVC概念 Spring MVC 是 Spring Framework 提供的 Web 组件&#xff0c;全称是 Spring Web MVC&#xff0c;是⽬前主流的实现 MVC 设计模式的框架&#xff0c;提供前端路由映射、视图解析等功能。 Java Web 开发者必须要掌握的技术框架。 2.Spring MVC 功能 MVC&am…

模块缝合-把A模块换成B模块(没写完)

把MLP Head替换为KAN 1.在model文件下新建一个python文件 2.把 模块文件里的整个KAN代码复制到新的python文件中 3.在开头导入 from model.KAN(新建文件名&#xff09; import KAN&#xff08;新建文件中的类名&#xff09; 4.sys.path.append(r"D: Icode(Kansformer"…

从零开始学Flink:揭开实时计算的神秘面纱

一、为什么需要Flink&#xff1f; 当你在电商平台秒杀商品时&#xff0c;1毫秒的延迟可能导致交易失败&#xff1b;当自动驾驶汽车遇到障碍物时&#xff0c;10毫秒的计算延迟可能酿成事故。这些场景揭示了一个残酷事实&#xff1a;数据的价值随时间呈指数级衰减。 传统批处理…

Appium如何支持ios真机测试

ios模拟器上UI自动化测试 以appiumwebdriverio为例&#xff0c;详细介绍如何在模拟器上安装和测试app。在使用ios模拟器前&#xff0c;需要安装xcode&#xff0c;创建和启动一个simulator。simulator创建好后&#xff0c;就可以使用xcrun simctl命令安装被测应用并开始测试了。…

JDK17 Http Request 异步处理 源码刨析

为什么可以异步&#xff1f; #调用起始源码 // 3. 发送异步请求并处理响应 CompletableFuture future client.sendAsync( request, HttpResponse.BodyHandlers.ofString() // 响应体转为字符串 ).thenApply(response -> { // 状态码检查&#xff08;非200系列抛出异常&…

【Zephyr 系列 8】构建完整 BLE 产品架构:状态机 + AT 命令 + 双通道通信实战

🧠关键词:Zephyr、BLE、状态机、双向透传、AT 命令、Buffer、主从共存、系统架构 📌适合人群:希望开发 BLE 产品(模块/标签/终端)具备可控、可测、可维护架构的开发者 🧭 引言:从“点功能”到“系统架构” 前面几篇我们已经逐步构建了 BLE 广播、连接、数据透传系统…