Questions tagged «delete»

在数据库结构化查询语言(SQL)中,DELETE语句从表中删除一个或多个记录。

9
如何在数据库中处理删除?
我想在Web应用程序中实现“取消删除”功能,以便用户可以改变主意并恢复已删除的记录。关于如何实施的想法?我考虑过的一些选项实际上是删除有问题的记录,并将更改存储在单独的审核表中,或者不删除记录,而是使用布尔“已删除”列将其标记为已删除。后一种解决方案在正常情况下将需要附加的应用程序逻辑来忽略“已删除”的记录,但将使在应用程序端恢复记录变得容易得多。

5
没有子句的大型DELETE FROM <table>的加速方法
使用SQL Server 2005。 我正在执行巨大的DELETE FROM而没有where子句。它基本上等效于TRUNCATE TABLE语句-除了不允许使用TRUNCATE。问题是表很大-一千万行,而且要花一个多小时才能完成。有没有什么办法可以使其更快而没有: 使用截断 禁用或删除索引? t日志已经在单独的磁盘上。 任何建议欢迎!

5
在PostgreSQL中非常慢的DELETE,解决方法?
我在PostgreSQL 9.2上有一个数据库,该数据库的主结构包含约70个表,并且每个客户机模式的结构相同的变量数量各不相同,每个表有30个表。客户端模式具有引用主模式的外键,而不是相反的方式。 我刚刚开始使用从先前版本中获取的一些真实数据填充数据库。当我不得不在主模式的非常中央的表中进行批量删除时,数据库已达到约1.5 GB(预计数周之内将增长到几十GB)。所有相关的外键都标记为ON DELETE CASCADE。 这将花费很长时间也就不足为奇了,但是在12个小时之后,很明显,我最好从头开始,删除数据库并再次启动迁移。但是,如果我需要在数据库正常运行并且更大时再重复此操作,该怎么办?是否有其他更快的方法? 如果我编写了一个脚本,该脚本将浏览从属表,从中央表最远的表开始,逐表删除从属行,会更快吗? 一个重要的细节是某些表上有触发器。

4
如何找出谁删除了一些SQL Server数据
我的老板昨天从一个客户那里询问,询问他们如何找到谁删除了他们在SQL Server数据库中的某些数据(如果重要的话,这是速成版)。 我以为可以从事务日志中找到它(假设它没有被截断)-这正确吗?如果是这样,您实际上将如何找到这些信息?

4
我需要在没有可用磁盘空间的情况下运行VACUUM FULL
我有一张桌子占用了我们服务器上接近90%的高清空间。我决定删除几列以释放空间。但是我需要将空间返回给操作系统。但是,问题是我不确定如果我运行VACUUM FULL并且没有足够的可用空间来复制表,会发生什么。 我知道不应该使用VACUUM FULL,但是我认为这是这种情况下的最佳选择。 任何想法,将不胜感激。 我正在使用PostgreSQL 9.0.6

2
从Postgres批量删除行的最有效方法
我想知道最有效的方法是从PostgreSQL删除大量行,这一过程每天都会是将数据批量导入(插入和删除的增量)到表中的一项重复任务。可能要删除数千行,甚至数百万行。 我有一个主键文件,每行一个。我所考虑的两个选项与以下内容类似,但我对PostgreSQL的内部知识了解不足/不了解,无法做出明智的决定,这是最佳选择。 DELETE使用简单WHERE的主键对文件中的每一行执行查询(或n使用IN()子句分批对删除进行分组) 使用COPY命令将主键导入到临时表中,然后使用连接从主表中删除 任何建议将不胜感激!

6
在30,000,000行表上的DELETE命令未完成
我继承了一个数据库,并希望清理并加快它的速度。我有一个表,其中包含30,000,000行,由于代表程序员的错误,其中许多行都是垃圾数据。在添加任何新的,更优化的索引之前,我已将表从MyISAM转换为InnoDB,并希望删除很多包含垃圾数据的行。 数据库是MySQL 5.0,我具有对该服务器的root访问权限。我首先通过Adminer运行这些命令,然后通过phpMyAdmin运行,结果均相同。 我正在运行的命令是, DELETE FROM `tablename` WHERE `columnname` LIKE '-%' 本质上,删除此列中以破折号开头的所有内容-。 它运行大约3-5分钟,然后当我查看进程列表时,它就消失了。 然后我跑 SELECT * FROM `tablename` WHERE `columnname` LIKE '-%' 它返回数百万行。 为什么我的删除语句没有完成? PS,我知道MySQL 5.0是过时的。我正在努力将数据库移至MySQL 5.6 w InnoDB(也许是MariaDB 10 w XtraDB),但是直到发生这种情况之前,我一直希望使用DB来解决此问题。 - 编辑已删除,请参阅我的答案。

2
为什么DELETE对性能有持续的影响?
最后是一个测试脚本,用于比较@table变量和#temp表之间的性能。我认为我已正确设置-性能计时已从外部获取在DELETE / TRUNCATE命令进行的。我得到的结果如下(以毫秒为单位)。 @Table Variable #Temp (delete) #Temp (truncate) --------------- -------------- ---------------- 5723 5180 5506 15636 14746 7800 14506 14300 5583 14030 15460 5386 16706 16186 5360 只是为了确保我理智,这表明CURRENT_TIMESTAMP(aka GetDate())是在语句时而不是批处理时使用的,因此TRUNCATE / DELETE与SET @StartTime = CURRENT_TIMESTAMP语句之间不应存在任何交互。 select current_timestamp waitfor delay '00:00:04' select current_timestamp ----------------------- 2012-10-21 11:29:20.290 ----------------------- 2012-10-21 11:29:24.290 当使用DELETE清除表时,在第一次运行和随后的运行之间的跳转中,这是非常一致的。我对DELETE的了解缺少什么?我已经重复了很多次,交换了命令,调整了tempdb的大小,使其不需要增长等。 CREATE TABLE …

2
触发器:将已删除的行移至存档表
我的restrictionsPostgreSQL数据库中有一个小表(约10行),每天都会删除和插入值。 我想要一个名为的表restrictions_deleted,将从中删除的每一行都restrictions将被自动存储。由于restrictions具有序列号,因此不会重复。 如何在PostgreSQL中编写这样的触发器?

6
在Oracle中删除大型记录集的最佳方法
我管理着一个应用程序,该应用程序具有非常大的Oracle数据库后端(一个表中的数据接近1TB,行数超过5亿)。数据库实际上并没有做任何事情(没有SProcs,没有触发器或任何东西),它只是一个数据存储。 每个月我们都需要从两个主表中清除记录。清除的标准各不相同,并且是行龄和几个状态字段的组合。通常,我们最终每月清除10到5000万行(我们每周通过导入增加大约3-5百万行)。 当前,我们必须批量删除约50,000行(即删除50000,提交,删除50000,提交,重复)。尝试一次全部删除整个批处理会使数据库在大约一个小时内无响应(取决于行数)。像这样批量删除行在系统上非常困难,我们通常必须在一周的时间内“在时间允许的情况下”进行删除。允许脚本连续运行可能会导致用户无法接受的性能下降。 我相信这种批量删除还会降低索引性能,并产生其他影响,最终导致数据库性能下降。一张表上有34个索引,索引数据的大小实际上大于数据本身。 这是我们的一位IT人员用来清除此错误的脚本: BEGIN LOOP delete FROM tbl_raw where dist_event_date &lt; to_date('[date]','mm/dd/yyyy') and rownum &lt; 50000; exit when SQL%rowcount &lt; 49999; commit; END LOOP; commit; END; 该数据库必须达到99.99999%,并且我们每年只有一次2天维护窗口。 我正在寻找一种删除这些记录的更好的方法,但是我还没有找到任何记录。有什么建议么?

2
数据库同步和软删除方案中的逻辑删除表与已删除标志
我需要跟踪已删除项目,以满足客户端同步的需要。 通常,最好是添加一个逻辑删除表和一个触发器,以跟踪何时从服务器数据库中删除了行-基本上是将逻辑删除表中的数据添加到逻辑删除表中的新行-还是将这些条目保留在原始表并将其标记为已删除(通常使用bit类型的列)以指示已删除行,而另一列用于跟踪删除发生的时间?
17 delete 

3
启用触发器后,记录删除速度缓慢
以为通过以下链接可以解决此问题-解决方法可以正常工作-但补丁程序没有解决。与Microsoft支持人员一起解决。 http://support.microsoft.com/kb/2606883 好的,所以我有一个问题想扔给StackOverflow看看是否有人有想法。 请注意这是与SQL Server 2008 R2 问题:启用触发器后,从具有15000条记录的表中删除3000条记录需要3-4分钟,而禁用触发器则仅需要3-5秒。 表格设定 我们将两个表称为Main和Secondary。辅助数据库包含我要删除的项目的记录,因此在执行删除时,我会加入到辅助数据库表。进程在delete语句之前运行,以用要删除的记录填充辅助表。 删除声明: DELETE FROM MAIN WHERE ID IN ( SELECT Secondary.ValueInt1 FROM Secondary WHERE SECONDARY.GUID = '9FFD2C8DD3864EA7B78DA22B2ED572D7' ); 该表有很多列和大约14个不同的NC索引。在确定引发问题的原因之前,我尝试了多种尝试。 打开页面锁定(默认情况下我们已关闭) 手动收集统计数据 禁用自动收集统计信息 验证索引的健康状况和碎片 从表中删除聚簇索引 检查执行计划(没有显示为丢失的索引,对于实际删除,成本为70%,对于记录的合并/合并,成本约为28% 扳机 该表具有3个触发器(每个触发器分别用于插入,更新和删除操作)。我修改了删除触发器的代码以使其返回,然后选择一个以查看触发了多少次。在整个操作过程中,它仅触发一次(如预期)。 ALTER TRIGGER [dbo].[TR_MAIN_RD] ON [dbo].[MAIN] AFTER DELETE AS SELECT 1 RETURN 回顾 启用触发器-语句需要3-4分钟才能完成 关闭触发器-语句需要3-5秒才能完成 …


2
为什么截断DDL?
我有一个面试问题,在面试过程中被问到。我回答了这个问题,但是面试官对我的回答并不那么确信。那么,有人请以我的理解纠正我吗? 问:为什么截断是DDL,而删除是DML?两者都做几乎相同的工作(删除行) Ans。当我们使用Truncate时,我们将取消分配数据分配的整个空间,而不保存到undo-table-space中。但是,在Delete的情况下,我们将所有数据放入undo表空间,然后删除所有数据。 请,如果有人知道上述最佳答案,请解释。
15 oracle  delete  ddl  truncate 

1
删除其他表中未引用的行
我在PostgreSQL 9.3数据库中有两个表:表link_reply有一个名为which_group指向table 的外键link_group。 我要删除link_group不link_reply存在相关行的所有行。听起来很基本,但我一直在努力。 这样简单吗(不起作用)? DELETE FROM link_group WHERE link_reply = NULL;

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.