oracle普通索引改唯一索引,Oracle唯一索引功能替代[通俗易懂]

oracle普通索引改唯一索引,Oracle唯一索引功能替代[通俗易懂]Oracle唯一索引在字段全部为NULL时,不做唯一性判断,允许重复插入,而在8t中即使均为NULL值也会做重复值判断,在某些场景下客户会存在此类需求,在数据量不大不存在性能问题的情况下可以考虑通过如下方式进行替代示例表createtable”informix”.secconstitute(iddecimal(20,0)notnull,codevarchar(32),namevar…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

Oracle唯一索引在字段全部为NULL时,不做唯一性判断,允许重复插入,而在8t中即使均为NULL值也会做重复值判断,在某些场景下客户会存在此类需求,在数据量不大不存在性能问题的情况下可以考虑通过如下方式进行替代

示例表

create table “informix”.secconstitute

(

id decimal(20,0) not null ,

code varchar(32),

name varchar(64),

sec_id decimal(20,0),

meas_id decimal(20,0),

constitute_type decimal(10,0),

order_no decimal(10,0),

meas_value decimal(22,6),

ttc_therm decimal(22,6),

region_id decimal(10,0),

replicate_flag decimal(10,0),

download_region decimal(10,0),

operator_str varchar(64),

factor_str varchar(64),

if_reverse decimal(3,0),

condi_type decimal(10,0),

primary key (id) constraint “informix”.pk_secconstitute

) extent size 64 next size 64 lock mode row;

revoke all on “informix”.secconstitute from “public” as “informix”;

create unique index “informix”.idx_secid_measid_constitutetype_orderno

on “informix”.secconstitute (sec_id,meas_id,constitute_type,

order_no) using btree in dbs3;

思路

1.删除原唯一索引替换为普通索引维持索引功能

2.通过触发器调用SPL进行非NULL值的唯一性判断,必要时中止操作

代码如下

drop index if exists index_438_1;

create index index_438_1 on secconstitute(sec_id,meas_id,constitute_type,order_no);

drop procedure if exists p4_ti_secconstitute_proc;

create procedure p4_ti_secconstitute_proc() referencing new as new for secconstitute

define v_str varchar(100);

define v_col varchar(100);

define v_sql lvarchar(500);

define v_count int8;

define v_flag int;

let v_col=”;

let v_str=”;

let v_count=0;

let v_sql=”;

if new.sec_id is not null or new.meas_id is not null or new.constitute_type is not null or new.order_no is not null then

if new.sec_id is not null then

let v_col=’sec_id’;

let v_str=’sec_id=’||new.sec_id;

else

let v_col=’sec_id’;

let v_str=’sec_id is null’;

end if;

if new.meas_id is not null then

if v_col != ” then

let v_col=v_col||’,’||’meas_id’;

else

let v_col=’meas_id’;

end if;

if v_str != ” then

let v_str=v_str||’ and meas_id=’||new.meas_id;

else

let v_str=’meas_id=’||new.meas_id;

end if;

else

if v_col != ” then

let v_col=v_col||’,’||’meas_id’;

else

let v_col=’meas_id’;

end if;

if v_str != ” then

let v_str=v_str||’ and meas_id is null’;

else

let v_str=’meas_id is null’;

end if;

end if;

if new.constitute_type is not null then

if v_col != ” then

let v_col=v_col||’,’||’constitute_type’;

else

let v_col=’constitute_type’;

end if;

if v_str != ” then

let v_str=v_str||’ and constitute_type=’||new.constitute_type;

else

let v_str=’constitute_type=’||new.constitute_type;

end if;

else

if v_col != ” then

let v_col=v_col||’,’||’constitute_type’;

else

let v_col=’constitute_type’;

end if;

if v_str != ” then

let v_str=v_str||’ and constitute_type is null’;

else

let v_str=’constitute_type is null’;

end if;

end if;

if new.order_no is not null then

if v_col != ” then

let v_col=v_col||’,’||’order_no’;

else

let v_col=’order_no’;

end if;

if v_str != ” then

let v_str=v_str||’ and order_no=’||new.order_no;

else

let v_str=’order_no=’||new.order_no;

end if;

else

if v_col != ” then

let v_col=v_col||’,’||’order_no’;

else

let v_col=’order_no’;

end if;

if v_str != ” then

let v_str=v_str||’ and order_no is null’;

else

let v_str=’order_no is null’;

end if;

end if;

if v_str != ” then

let v_sql=’select count(*) from secconstitute where ‘||v_str||’ group by ‘||v_col;

prepare p from v_sql;

declare c cursor for p;

open c;

fetch c into v_count;

free p;

close c;

free c;

end if;

if v_count >1 then

raise exception -746,0,’Duplicated Sec_Id,Meas_Id,Constitue_Type,Order_No Value Founded!!’;

end if;

end if;

end procedure;

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/192910.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java基础——成员变量、局部变量和静态变量的区别

    Java基础——成员变量、局部变量和静态变量的区别之前在刚开始学习Java的时候,就谈了谈Java基础中的变量,虽然知道这货以后会经常用到,但没想到了基本语法这里,竟然有冒出来了成员变量、局部变量和静态变量。变来变去太容易让人搞晕了,挑拣出来梳理一下喽!    要想区分这哥仨,首先,我们得知道它们分别是什么。先从成员变量下刀。成员变量    我们来研究一个事物:        属性:外在特征;例如人的身高

    2022年5月1日
    63
  • VSCode安装教程(超详细)[通俗易懂]

    VSCode安装教程(超详细)[通俗易懂]VSCode安装教程(超详细)下载安装一、同意协议(废话了我)二、选择合适的安装位置,下一步三、下一步四、这里注意下,进行相关的选择五、点击安装六、等待安装完成,很快配置中文界面上面安装完成后会出现下面的界面,我们搜索Chinese,点击install然后Restart重启后就ok了,中文界面下载下载地址:DownloadVisualStudioCode选择相应的版本下载。安装跟着图一步步走,简单明了。一、同意协议(废话了我)二、选择合适的安装位置,下一步三、下一步四

    2022年8月22日
    7
  • 个人微信号API接口,微信机器人

    个人微信号API接口,微信机器人前段时间公司需求开发一套自定义的微信机器人,需求是可以自己批量添加好友、批量打标签等进行好友管理,社群管理需要自动聊天,自动回复,发朋友圈,转发语音,以及定时群发等,还可以提取聊天内容,进行数据汇总,收藏快捷回复各种功能!一堆需求砸下来,调研开发了3个月,3个月啊!!!(主要被各种技术走偏路),终于成功了,都是走过的心酸泪,分享给大家,大家学习完,记得给我点个赞!!!大家一般需求点无非是以下几个需求:1.开发个人微信营销系统2.开发自定义的微信机器人,3.开发微信智能聊天客服系统

    2022年5月18日
    78
  • Promise的含义和用法「建议收藏」

    Promise的含义和用法「建议收藏」含义Promise是异步编程的一种解决方案。Promise对象有以下2个特点:1.对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:Pending(进行中)、Resolved(已完成)和Rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是Promise这个名字的由来,它的英语意思就是“承诺”,表示其…

    2022年5月30日
    33
  • 心情不好的时候,用 Python 画棵樱花树送给自己吧「建议收藏」

    心情不好的时候,用 Python 画棵樱花树送给自己吧「建议收藏」最近发生了很多事情,工作不开心,爱情无果而终,身边的小伙伴陆陆续续离职。虽然都不是会一下子击垮自己的事情,但是积攒起来,还是会有突然感到疲惫和倦怠的时候,有一种不知道下一步要走向哪里的无力感。在这个城市留下了很多的回忆,但是身边的人一个个离开,走到现在,似乎没有太多留恋的了,也没想好未来要去哪里。自己是一个始终需要新鲜感的人,在这里停留了太久,大概到了该说再见的时候了吧。

    2022年5月11日
    38
  • sql server创建数据表的完整语法_sqlserver语法大全

    sql server创建数据表的完整语法_sqlserver语法大全sqlserver基础语法创建数据库创建表1.创建数据库2.表的创建3.在现有表中添加标识列4.创建外键5.添加外键6.约束7.创建局部临时表8.创建全局临时表9.创建具有check约束字段的数据库表10.创建含有计算字段的数据库表11.创建含有自动编号字段的数据库表12.创建含有排序字段和默认值的数据表13.动态判断数据库表是否存在14.查看表的各种信息,可以查看指定数据库表的属性、表中字…

    2025年7月6日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号