您的位置 主页 正文

merge into插入数据出现主键冲突?

一、merge into插入数据出现主键冲突? 在后台中开发了一个存储过程用到merge into,主要是根据主键值来查看目标表中是否有该主键值,如果有进行更新,否则插入,然而在测试过程中经

一、merge into插入数据出现主键冲突?

在后台中开发了一个存储过程用到merge into,主要是根据主键值来查看目标表中是否有该主键值,如果有进行更新,否则插入,然而在测试过程中经常出现ORA-00001 主键冲突。

前端开发人员口口声声说传入的数据不会有重复值,怀疑数据库的问题。我相信Oracle不会有这样的bug。

索性我在后台演示出现该错误的方法。

1、创建测试表

create table T_TEST

(

A CHAR(1),

B NUMBER

)

2、创建测试存储过程

create or replace procedure test(i_num in number) is

begin

MERGE INTO t_test t

USING (SELECT '1' a, ROWNUM b FROM DUAL CONNECT BY ROWNUM <= i_num) TA

ON (t.a = TA.a)

WHEN MATCHED THEN

UPDATE SET T.b = t.b + TA.b

WHEN NOT MATCHED THEN

INSERT VALUES (TA.a, TA.b);

commit;

end test;

3、执行存储过程test

SQL> exec test(12);

PL/SQL procedure successfully completed

SQL> select * from t_test;

A B

- ----------

1 12

1 11

1 10

1 9

1 8

1 7

1 6

1 5

1 4

1 3

1 2

1 1

12 rows selected

SQL>

4、清空t_test

SQL> truncate table t_test;

Table truncated

SQL>

5、添加主键

SQL> ALTER TABLE T_TEST ADD CONSTRAINT PK_T_TEST PRIMARY KEY (A) USING INDEX;

Table altered

6、在t_test中添加一行数据

SQL> exec test(1);

PL/SQL procedure successfully completed

SQL> select * from t_test;

A B

- ----------

1 1

7、此时尝试再次添加多行数据,此时会出现错误ORA-30926,原因是在Using选项后面中a有多个重复值

SQL> exec test(10);

begin test(10); end;

ORA-30926: 无法在源表中获得一组稳定的行

ORA-06512: 在 "TEST.TEST", line 3

ORA-06512: 在 line 1

SQL>

8、清空t_test

SQL> truncate table t_test;

Table truncated

9、尝试添加多行a值相同的数据,提示主键冲突

SQL> exec test(10);

begin test(10); end;

ORA-00001: 违反唯一约束条件 (TEST.PK_T_TEST)

ORA-06512: 在 "TEST.TEST", line 3

ORA-06512: 在 line 1

SQL>

由此可以证明还是由于传入的数据有重复值导致的。

具体得在程序中继续跟踪,好让他们心服口服。

二、oracle怎么导出数据?

1、打开电脑左下角【开始菜单】,在右侧找到【运行】选项2、在弹出的运行栏输入【cmd】,点击确定3、在弹出的cmd命令行界面输入【exp】命令,点击回车4、此时进入oracle命令行界面,输入用户名和密码,点击回车5、登录成功设置导出数据参数,选择数据文件导出路径,点击回车6、参数设置完成,此时进行导出表数据操作7、操作完成找到存放的路径,可以看到此书生成一个DMP文件。

三、oracle怎样导出数据?

1、打开oracle数据库,点击登陆选项,点击文件选项,点击新建选项,最后点击sql窗口;

2、然后在sql窗口中进行编写sql语句的操作,勇sql语句进行查询出想要导出来的数值;

3、然后在查询出来数据的地方,不要选中数据,把鼠标放到空白单元格处进行鼠标右键操作,找到复制到Excel选项;

4、然后在复制到excel中选择想要保存的格式-->作为xls保存,打开后则是excel形式的数据;

5、默认的保存路径-->将鼠标放在excel名称上-->会出现路径-->根据路径打开即可。

四、oracle数据库里怎么把字体调大?

说的不太清楚

1,加大字体是在界面CSS上设置字号大小的

2,表示单个字节可以放多少个字

五、oracle数据库如何造数据?

oracle数据库造数据的方法无非两种:

一个是使用oracle的建库工具dbca,这是一个图形界面工具,而且使用起来也方便且容易理解。

另一种方法就是手工库,这也就是我们今天要讨论的内容。

手工建库比起使用dbca建库来说,是比较麻烦的,但是如果我们学好了手工建库的话,就可以使我们更好的理解oracle数据库的体系结构。

六、怎么把oracle数据导入sqlserver数据?

可以的

1、在目的SQL Server数据库服务器上安装ORACLE Client软件或者ORACLE ODBC Driver.

通过oracle客户端,在netmanager中建立“服务(TNS server)”,并测试连接上oracle数据库正常

2、在sqlserver的DTS(导入和导出数据工具)进行

(1)选择数据源:

数据源:oracle in oracle9i

选择:用户/系统DSN:

点击新建DSN:选择数据源类型:系统数据源,

下一步:选择驱动程序:oracle in oracle9i,下一步,完成 ,

进入oracle odbc driver configration页面

再输入:datasorce name:GZDS

TNS server name:gz(通过netmanager定义好TNS server)

user:(oracle登录用户)

填写好以后,进行"TEST Connection"

可以连通,则点击“ok”,DSN建立完成

数据源选择完成,点击“下一步”进入“选择目的”

(2)选择目的

目的:用于SQL Server的Microsoft OLE DB提供程序

服务器:192.168.0.63

选择:使用sqlserver身份登录

用户名:sa 密码:pass

并刷新,选择好数据库:test(目的数据库,提前建立好的)并点击“下一步”

a.从数据源复制表和数据(下一步:选择源表及视图)

b.用一条查询语句指定要传输的数据(进行sql编辑)

(通过以上选择好要复制的数据表或者相关视图)

再点击下一步“保存、调度和复制包”

(3)“保存、调度和复制包”

时间:立即运行

再点击下一步:进行:“正在完成DTS导入导出”向导

(4)完成:

点击:“完成”按钮,系统进入数据复制“正在执行包”的页面,

可以看到数据正在复杂的进度条

注意:在ORACLE表和SQL Server表之间'转换'那步很重要,

可以改变默认的字段数据类型,如image->text,decimal->int

七、oracle全局数据库和oracle实例?

全局数据库和实例,只有在集群时才有区别。一个全局数据库对应多个实例。

八、Oracle使用Merge into有没有简单的写法?一条数据原表没有。怎么删除目标表的这行数据?

必须都要写一遍,你这要删除需要按条件delete啊,merge的原理你要弄明白啊,merge是根据源表对目标表进行匹配查询,匹配成功时更新,不成功时插入

九、oracle怎么批量insert数据?

百万级的数据量真的不算大,使用一些常用的同步就好了,创建一个DBLINK,然后使用MERGE就可以了,两个库中的主键不一样,就从对方的库中抽过来(INSERT 操作),相同则更新(UPDATE操作)

或者使用触发器也可以,当数据有变动时,自动执行相应的操作写入到对方库中。

十、oracle 数据库性能?

一、数据库性能指标

数据库性能一般用两个方面的指标来衡量:响应时间和吞吐量。响应越快,吞吐量越大,数据库性能越好。

1. 操作系统有关的指标:CPU平均利用率、内存平均占用率、硬盘占用率、I/O数量、网络时延

2. 数据库有关的指标:I/Owait、Mem平均使用率、cpu平均使用率、在一次I/O操作中所读的最大BLOCKS数、Log的增长情况、数据库的访问速度、数据库能支持的最大用户数、数据库CACHE命中率、不同数据库参数下的性能情况、锁的处理

二、Oracle

注:以下指标取自Oracle的性能分析工具Statspack所提供的性能分析指标。

1.关于实例效率(Instance Efficiency Percentages)的性能指标

(1)缓冲区未等待率(Buffer Nowait %)

指在缓冲区中获取Buffer的未等待比率。该指标的值应接近100%,如果该值较低,则可能要增大buffer cache。

(2)Redo缓冲区未等待率(Redo NoWait %)

指在Redo缓冲区获取Buffer的未等待比率。该指标的值应接近100%,如果该值较低,则有2种可能的情况:

1.online redo log没有足够的空间;

2.log切换速度较慢。

(3)缓冲区命中率(Buffer Hit %)

指数据块在数据缓冲区中的命中率。

(4)内存排序率(In-memory Sort %)

指排序操作在内存中进行的比率。当查询需要排序的时候,数据库会话首先选择在内存中进行排序,当内存大小不足的时候,将使用临时表空间进行磁盘排序,但磁盘排序效率和内存排序效率相差好几个数量级。

(5)共享区命中率(Library Hit%)

该指标主要代表sql在共享区的命中率。

(6)软解析的百分比(Soft Parse %)

该指标是指Oracle对sql的解析过程中,软解析所占的百分比。软解析(soft parse)是指当Oracle接到Client提交的Sql后会首先在共享池(Shared Pool)里面去查找是否有之前已经解析好的与刚接到的这一个Sql完全相同的Sql。当发现有相同的Sql就直接用之前解析好的结果,这就节约了解析时间以及解析时候消耗的CPU资源。

(7)闩命中率(Latch Hit%)

指获得Latch的次数与请求Latch的次数的比率。

为您推荐

返回顶部