现在我有一个名为"数据"的元组列表。
[
('171115090000',
Timestamp('2017-11-15 09:00:00'),
'PAIR1',
156.0)
]
我想将此列表插入Oracle DB,我的代码是
cur.executemany(
'''INSERT INTO A
("SID","DATE","ATT","VALUE")
VALUES(:1,:2,:3,:4)''',Data)
效果很好。但是,如果我想在此数据库中添加/替换新记录,我必须创建一个表B来放置这些记录,然后合并A和B.
在没有创建新表的情况下,我可以完成我的工作吗?
我知道我可以从A中选择所有记录,将它们转换为DataFrame并在Python中合并DataFrames,这是一个很好的解决方案吗?
答案 0 :(得分:0)
重复密钥更新是否有类似内容
在Oracle中,它被称为MERGE
;看看下面的例子:
开头的表格内容:
SQL> select * From dept;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
MERGE声明:
SQL> merge into dept d
2 using (select deptno, dname, loc
3 from (select 10 deptno, 'ACC' dname, 'NY' loc from dual --> already exists, should be updated
4 union all
5 select 99 , 'NEW DEPT' , 'LONDON' from dual --> doesn't exists, should be inserted
6 )
7 ) x
8 on (d.deptno = x.deptno)
9 when matched then update set
10 d.dname = x.dname,
11 d.loc = x.loc
12 when not matched then insert (d.deptno, d.dname, d.loc)
13 values (x.deptno, x.dname, x.loc);
2 rows merged.
结果:如您所见,现有DEPTNO = 10
的值已更新,而新的DEPTNO = 99
已插入表格中。
SQL> select * From dept;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACC NY
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
99 NEW DEPT LONDON
SQL>
我不会说Python,所以我无法撰写您可能会使用的代码,但我希望您能够自己设置代码。