如何从没有主键的Oracle表中删除大量记录

德鲁·阿申布瑞纳(Drew Aschenbrener)

情况:我正在将整个SQL表加载到程序中。为了方便起见,我使用熊猫来维护行数据。然后,我要创建一个要从SQL表中删除的行的数据框。不幸的是(并且我无法更改)表除了内置的Oracle ROWID(不是真正的表列,而是伪列)之外没有任何主键,但是如果有的话,我可以使ROWID成为数据框的一部分我需要。

该表有成千上万的行,并且每次程序运行时我可能会删除几千条记录。

问题:使用Cx_Oracle删除没有主键的多行/记录的最佳方法是什么?我认为创建提交数千个delete语句的循环不是非常有效或pythonic。尽管我担心要构建一个以ROWID为键的单SQL删除语句,并且该语句包含一个包含数千个项目的子句:

Where ROWID IN ('eg1','eg2',........, 'eg2345')

这种担忧有效吗?有什么建议?

无液

使用ROWID

既然可以使用ROWID,那将是理想的选择。并且,根据Oracle版本的不同,查询长度限制可能足够大,以至于IN子句中具有这么多元素的查询问题是该元素的个数IN表达式列表-仅限于1000

因此,您要么必须一次将RowID列表分解为1000组,要么一次只删除一行。有或没有executemany()

>>> len(delrows)  # rowids to delete
5000
>>> q = 'DELETE FROM sometable WHERE ROWID IN (' + ', '.join(f"'{row}'" for row in delrows) + ')'
>>> len(q)  # length of the query
55037
>>> # let's try with just the first 1000 id's and no extra spaces
... q = 'DELETE FROM sometable WHERE ROWID IN (' + ','.join(f"'{row}'" for row in delrows[:1000]) + ')'
>>> len(q)
10038

您可能处于查询长度限制内,甚至可以使用最小的','项目分隔符保存一些字符

没有ROWID

如果没有主键或ROWID,则标识每一行的唯一方法是在WHERE子句中指定所有列,并一次执行许多行,它们需要进行或运算:

DELETE FROM sometable
WHERE  ( col1 = 'val1'
         AND col2 = 'val2'
         AND col3 = 'val3' )  -- row 1
    OR ( col1 = 'other2'
         AND col2 = 'value2'
         AND col3 = 'val3' )  -- row 2
    OR ( ... )                -- etc

如您所见,它不是构造最佳查询,但允许您在没有ROWID的情况下进行查询。


在这两种情况下,您可能都不需要使用参数化查询,因为IN1中列表或OR2中的分组是可变的。(是的,您可以在构建具有数千个参数的整个扩展SQL之后,以参数化方式创建它。不确定此限制是什么。)这种executemany()方式显然更容易编写和执行,但是为了提高速度,可以使用单个大型查询(上面的两个)可能会在成千上万个项目上胜过执行。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

从没有主键的表中删除记录

从没有主键的其他表中删除相关行

如何使用房间从没有主键的表迁移?

从没有主键的MySQL表中获取随机行-已优化

从没有任何时间戳或日期列的表中删除旧记录

如何从没有键的表中检索非重复记录?

如何从没有ID的表中获取行

如何从没有主目录的/ etc / passwd中获取所有用户

如何在没有主键的情况下引用表中的记录

如何从没有逗号且键中没有值的字典中提取记录

MySQL-如何从没有关系的表中选择记录

JSoup,从没有标签的HTML中删除文本

如何从没有访问权限的脚本中的div中删除javascript / jquery悬停事件?

Rails:从没有模型的表中检索值

在Spring data JPA中,如何从没有实体存储库的表中查询数据

如何从没有硬件菜单按钮的设备中删除DownActionBar?

如何从没有值的python中删除重复项

如何从没有匹配列的表中获取数据?

如何从没有任何连接的两个不同表中获取值

如何从没有索引的列中获取数据

没有主键的表

SQL删除SQL Server上没有主键的表中的重复行

在续集中没有主键的情况下从表中删除

如何在Fat-Free Framework中插入没有主键的多个记录

如何从没有命令提示符的文件中删除“系统文件”属性?

如何使用SQLAlchemy定义没有主键的表?

ActiveRecord从没有关联的关联中查找记录

在PostgreSQL中什么表没有主键用于

为什么DBMS说表中没有主键