oracle索引与mysql区别_MySQL和Oracle中的唯一性索引从差别(r12笔记第83天)

今天在修复MySQL数据的时候,发现一个看起来“奇怪”的问题。

有一个表里存在一个唯一性索引,这个索引包含3个列,这个唯一性索引的意义就是通过这3个列能够定位到具体1行的数据,但是在实际中却发现这个唯一性索引还是有一个地方可能被大家忽略了。

我们先来看看数据的情况。

CREATE TABLE `test_base_data` (

`servertime` datetime DEFAULT NULL COMMENT '时间',

`appkey` varchar(64) DEFAULT NULL,

...

`timezone` varchar(50) DEFAULT NULL COMMENT '时区',

UNIQUE KEY `servertime_appkey_timezone` (`servertime`,`appkey`,`timezone`),

KEY `idx_ccb_r_b_d_ak_time` (`servertime`,`appkey`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

表里的数据量在300万左右

> select count(*)from test_base_data;

+----------+

| count(*) |

+----------+

|  3818630 |

+----------+

我在分析一个问题的时候,发现按照目前的情况,似乎主键和唯一性索引有一点差别(当然回过头来看这个问题本身就很明确了)。

于是我尝试删除这个唯一性索引,转而创建一个主键,但是这个操作竟然抛出了数据冲突的的错误。

> alter table test_base_data add primary key `servertime_appkey_timezone` (`servertime`,`appkey`,`timezone`);

ERROR 1062 (23000): Duplicate entry '2017-05-09 13:15:00-1461048746259-' for key 'PRIMARY'

数据按照appkey 1461048746259来过滤,得到的一个基本情况如下:

> select servertime,appkey,timezone from ccb_realtime_base_data limit 5;

+---------------------+---------------+----------+

| servertime          | appkey        | timezone |

+---------------------+---------------+----------+

| 2017-05-09 20:25:00 | 1461048746259 | NULL     |

| 2017-05-09 13:15:00 | 1461048746259 | NULL     |

| 2017-05-09 19:00:00 | 1461048746259 | NULL     |

| 2017-05-09 17:00:00 | 1461048746259 | NULL     |

| 2017-05-09 20:30:00 | 1461048746259 | NULL     |

+---------------------+---------------+----------+

单纯这样看,看不出什么问题来,但是当我有count来得到重复数据的时候,着实让我惊呆了。

> select count(1) from ccb_realtime_base_data where servertime ='2017-05-09 13:15:00' and appkey='1461048746259';

+----------+

| count(1) |

+----------+

|      709 |

+----------+

这一行记录,在这个表里竟然有重复的数据达到700多个。

按照这个情况,表里的数据缺失有大的问题,但是为什么唯一性索引就查不出来呢。

这一点上,Oracle和MySQL的立场是一致的,那就是主键和唯一性索引的差别,出了主键的根红苗正,主键是唯一性索引的一种之外,还有一点很重要,我们掰开了揉碎了来说。

为了方便演示,我就创建一个简单的表unique_test\create table unique_test(id int,name varchar(30))

添加唯一性约束

alter table unique_test add unique key(id);

插入1行数据

insert into unique_test values(1,'aa');

再插入1行,毫无疑问会抛出错误。

insert into unique_test values(1,'aa');

ERROR 1062 (23000): Duplicate entry '1' for key 'id'

我们删除原来的索引,创建一个新的索引,基于列(id,name)

alter table unique_test drop index id;

alter table unique_test add unique key (id,name);

创建新的索引

> insert into unique_test values(1,'aa');

ERROR 1062 (23000): Duplicate entry '1-aa' for key 'id'

可见唯一性约束是生效了,插入不冲突的数据没有任何问题。

insert into unique_test values(1,'bb');

所以这样来看,多个键值列也都能校验出来嘛,我们再建一个列,创建一个复合索引,含有3个列。

> alter table unique_test drop index id

创建一个列created,换个数据类型。

> alter table unique_test add column created datetime;

创建唯一性索引,基于3个列。

> alter table unique_test add unique key(id,name,created);

这个时候模拟一下数据

> insert into unique_test values(1,'aa',null);

这个时候问题就很明显了,竟然校验不出来了。

> select *from unique_test;

+------+------+---------+

| id   | name | created |

+------+------+---------+

|    1 | aa   | NULL    |

|    1 | aa   | NULL    |

|    1 | bb   | NULL    |

+------+------+---------+

3 rows in set (0.00 sec)

这问题在哪儿呢。

我们来看看create table的语句。

> show create table unique_test;

+-------------+-------------------------------------

| Table       | Create Table                                                                                        |

+-------------+--------------------------------------

| unique_test | CREATE TABLE `unique_test` (

`created` datetime DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

+-------------+---------------------------------------我就把问题点透,就在哪个null的地方上,这个是这个问题的根本,进一步来说,这个是唯一性索引和主键的一个差别,那就是主键约束相比唯一性约束来说,还有一个默认的属性,那就是not null

但是同样都是null的差别,MySQL和Oracle的结果是否相同呢。我们来测试一下。顺便熟悉一下两种数据库的语法风格。

在Oracle里面,代表的含义是不同的,大大不同,可以看看下面的结果来对比一下。

SQL> create table unique_test(id number,name varchar2(30));

Table created.

SQL> alter table unique_test add constraint uq_test unique(id);

Table altered.

SQL> insert into unique_test values(1,'a');

1 row created.

SQL> /

insert into unique_test values(1,'a')

*

ERROR at line 1:

ORA-00001: unique constraint (PDB_MGR.UQ_TEST) violated

SQL> alter table unique_test drop constraint uq_test;

Table altered.

SQL> alter table unique_test add constraint uq_test unique(id,name);

Table altered.

SQL> insert into unique_test values(2,'bb');

1 row created.

SQL> commit;

SQL> alter table unique_test drop constraint uq_test;

SQL> alter table unique_test add created date;

SQL> alter table unique_test add constraint uq_test unique(id,name,created);

Table altered.

SQL>  insert into unique_test values(1,'a',null);

insert into unique_test values(1,'a',null)

*

ERROR at line 1:

ORA-00001: unique constraint (PDB_MGR.UQ_TEST) violated

SQL>  insert into unique_test values(2,'bb',null);

insert into unique_test values(2,'bb',null)

*

ERROR at line 1:

ORA-00001: unique constraint (PDB_MGR.UQ_TEST) violated

98aae661ed21883944e160c039074b8b.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要在Oracle EBS R12设置文,需要进行以下步骤: 1. 安装文语言包:首先,确保已经下载并安装了适用于Oracle EBS R12文语言包。语言包通常可以从Oracle官方网站上获取。安装语言包的方法因版本而异,可以根据Oracle提供的文档进行相应的操作。 2. 设置语言和地区:登录到Oracle EBS R12管理界面,进入"系统管理员"功能。选择"配置",然后选择"个人设置"。在"语言"部分,选择文语言。在"地区"部分,选择适合您的地区设置。保存更改并重新启动Oracle EBS R12。 3. 配置文打印:如果您需要打印文文档,您需要配置打印功能以支持文字符。您可以通过编辑打印模板并选择适当的文字体来实现。可以参考Oracle提供的相关文档以获取更多详细信息。 4. 配置文报表:如果您需要生成文报表,您需要确保在Oracle EBS R12配置了相应的文报表模板。您可以使用Oracle提供的报表设计器工具来设计和编辑文报表模板。然后在报表生成时选择适当的文报表模板。 5. 测试和验证:完成以上步骤后,您可以进行一些基本的测试和验证,以确保Oracle EBS R12已成功设置为文。您可以尝试登录到系统并查看界面上的文本是否已更改为文。您还可以打印和生成一些文报表,以确保它们正确地显示和输出。 总结起来,要在Oracle EBS R12设置文,您需要安装文语言包,设置语言和地区,配置文打印和报表,并进行相应的测试和验证。这样就可以成功将Oracle EBS R12设置为文了。 ### 回答2: 在Oracle EBS R12设置文需要按照以下步骤进行操作: 1. 确保操作系统的语言设置为文。进入操作系统的设置界面,将语言设置为文,并确保文语言包已安装。 2. 安装文语言包。在Oracle EBS R12安装目录找到"R12: $ONTOP"目录,进入"Patch"文件夹,找到适用于文语言的补丁文件,并执行安装。 3. 配置Oracle EBS R12文环境。进入Oracle EBS R12的应用程序目录,找到"adconfig.sh"文件,使用命令行方式执行该文件。根据提示,选择文语言环境,并完成配置。 4. 配置文字体。在Oracle EBS R12的应用程序目录,找到"adcfgclone.pl"文件,使用命令行方式执行该文件。根据提示,选择文字体,以确保文字符能正常显示。 5. 重启Oracle EBS R12应用程序和数据库。在配置完文环境后,需要关闭Oracle EBS R12的应用程序和数据库,并重新启动,以使配置生效。 6. 测试文设置。登录Oracle EBS R12系统,并进行简单的文测试,确保系统的菜单、界面、报表等都能正确显示文字符。 通过上述步骤,就可以在Oracle EBS R12成功设置文环境。需要注意的是,这只是一种基本的设置方式,具体操作可能会因系统版本和配置有所差异,需要根据实际情况进行调整。 ### 回答3: 要在Oracle EBS R12系统设置文,首先需要确保系统的语言设置正确。以下是设置文的步骤: 1. 确保操作系统的语言设置为文。在Windows操作系统,打开控制面板,选择“区域和语言选项”,在“格式”选项卡选择“文(简体文)”,并点击“应用”按钮。 2. 下载Oracle EBS R12文语言包。可以从Oracle官方网站上下载适用于R12版本的文语言包。 3. 安装文语言包。运行下载的语言包文件,并按照安装向导的指示完成安装过程。 4. 配置Oracle EBS R12文语言。登录EBS系统管理员账户,选择“系统管理”>“配置”>“个性化用户界面”>“个性化”选项卡。 5. 在“个性化”选项卡,选择“XML启用”和“XML文件”的复选框,并输入完整的文语言包路径。 6. 点击“确定”按钮保存设置,并重新启动Oracle EBS R12系统。 7. 登录到EBS系统的用户界面时,选择适合的文语言。 通过以上步骤,您就可以在Oracle EBS R12系统成功设置文语言。请注意,文语言包的安装和配置可能会因具体的Oracle EBS版本而有所不同,建议在进行设置之前参考官方文档或向技术支持寻求帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值