标签: sql-delete

更快捷的删除匹配行的方法?

在数据库方面,我是一个相对新手.我们正在使用MySQL,而我正在尝试加速似乎需要一段时间才能运行的SQL语句.我在SO上寻找类似的问题,但没找到.

目标是删除表A中表B中具有匹配id的所有行.

我目前正在做以下事情:

DELETE FROM a WHERE EXISTS (SELECT b.id FROM b WHERE b.id = a.id);
Run Code Online (Sandbox Code Playgroud)

表a中约有100K行,表b中约有22K行.列'id'是两个表的PK.

这个声明在我的测试盒上运行大约需要3分钟 - 奔腾D,XP SP3,2GB内存,MySQL 5.0.67.这对我来说似乎很慢.也许不是,但我希望加快速度.是否有更好/更快的方法来实现这一目标?


编辑:

一些可能有用的其他信息.表A和B具有与我创建表B时所做的相同的结构:

CREATE TABLE b LIKE a;
Run Code Online (Sandbox Code Playgroud)

表a(以及表b)有一些索引可以帮助加快针对它的查询.再说一遍,我是DB工作的相对新手,还在学习.我不知道这对事情有多大影响,如果有的话.我认为它确实有效,因为索引也必须清理,对吧?我还想知道是否有任何其他数据库设置可能会影响速度.

另外,我正在使用INNO DB.


以下是一些可能对您有所帮助的其他信息.

表A有一个类似于此的结构(我已经对此进行了清理):

DROP TABLE IF EXISTS `frobozz`.`a`;
CREATE TABLE  `frobozz`.`a` (
  `id` bigint(20) unsigned NOT NULL auto_increment,
  `fk_g` varchar(30) NOT NULL,
  `h` int(10) unsigned default NULL,
  `i` longtext,
  `j` bigint(20) NOT NULL,
  `k` bigint(20) default NULL,
  `l` varchar(45) NOT NULL,
  `m` int(10) unsigned default NULL,
  `n` varchar(20) default …
Run Code Online (Sandbox Code Playgroud)

mysql performance sql-execution-plan sql-delete

58
推荐指数
4
解决办法
3万
查看次数

如何在MySQL中回滚我的最后一个删除命令?

我不小心从表中删除了一些大量的行......

我该如何回滚?

我使用PuTTY执行查询.

如果你们中的任何一个人能安全地引导我走出这个......我将不胜感激......

mysql sql rollback sql-delete

52
推荐指数
5
解决办法
18万
查看次数

java.lang.IllegalArgumentException:删除分离的实例com.test.User#5

我有一个使用JPA(transaction-type ="JTA")的java EE项目,hibernate作为提供者.我写我的bean来处理CRUD的事情.该程序在JBOSS 7 AS中运行.

我有一个EntityManagerDAO:

@Stateful
public class EntityManagerDao implements Serializable {

    @PersistenceContext(unitName = "dtdJpa")
    private EntityManager entityManager;

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public Object updateObject(Object object) {
        object = entityManager.merge(object);
        return object;
    }

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void createObject(Object object) {
        entityManager.persist(object);
    }

    public void refresh(Object object) {
        entityManager.refresh(object);
    }

    public <T> T find(Class<T> clazz, Long id) {
        return entityManager.find(clazz, id);
    }

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void deleteObject(Object object) {
        entityManager.remove(object);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当我调用时deleteObject,会出现这个异常.

java.lang.IllegalArgumentException:删除分离的实例com.test.User#5

这是怎么造成的,我该如何解决?

jpa entitymanager illegalargumentexception sql-delete

51
推荐指数
1
解决办法
7万
查看次数

DELETE语句中的MySQL LIMIT

我为最近遇到的错误整理了一个测试表.它涉及在尝试从MySQL表中删除单个记录时使用LIMIT.

我说的错误是" 你的SQL语法有错误;检查与你的MySQL服务器版本相对应的手册,以便在第1行的'LIMIT 1'附近使用正确的语法 "

我放在一起的表叫做测试 ; 它有3列,id,namecreated.我用几个记录填充了表,然后尝试删除一个.以下是我过去尝试完成此操作的声明.

DELETE t FROM test t WHERE t.name = 'foo' LIMIT 1

如果不使用LIMIT 1,语句执行得很好,但是如果不需要它,我当然不会使用LIMIT.

我完全知道我可以使用另一个语句来成功完成此DELETE.见下文: DELETE FROM test WHERE name = 'foo' LIMIT 1

但是我的问题集中在为什么第一个声明不适用于LIMIT.

所以我的问题是,对于生成此错误的第一个语句,我做错了什么?

mysql limit sql-delete

49
推荐指数
4
解决办法
11万
查看次数

我收到错误"DELETE语句与REFERENCE约束冲突"

我试图用外键截断一个表并得到消息:

" 无法截断表,因为它正被FOREIGN KEY约束引用 ".

我阅读了很多关于这个问题的文献,并认为我通过使用delete找到了解决方案

DELETE FROM table_name DBCC CHECKIDENT (table_name, RESEED, 0)
Run Code Online (Sandbox Code Playgroud)

但我仍然收到一条错误消息:

" DELETE语句与REFERENCE约束冲突 ".

当我尝试使用Microsoft Management Studio删除并执行以前的查询时

DELETE FROM table_name DBCC CHECKIDENT (table_name, RESEED, 0)
Run Code Online (Sandbox Code Playgroud)

它没有给出错误并且正常工作.我想从表中删除所有信息并添加新信息,但我不想删除并创建外键.

c# sql truncate sql-delete

48
推荐指数
3
解决办法
14万
查看次数

计算SQL Server存储过程中已删除行的数量

在SQL Server 2005中,是否有一种删除行并被告知实际删除了多少行的方法?

我可以select count(*)用相同的条件做一件事,但我需要这完全值得信赖.

我的第一个猜测是使用@@ROWCOUNT变量 - 但是没有设置,例如

delete 
from mytable 
where datefield = '5-Oct-2008' 

select @@ROWCOUNT 
Run Code Online (Sandbox Code Playgroud)

总是返回0.

MSDN建议OUTPUT构建,例如

delete from mytable 
where datefield = '5-Oct-2008' 
output datefield into #doomed

select count(*) 
from #doomed
Run Code Online (Sandbox Code Playgroud)

这实际上失败了,语法错误.

有任何想法吗?

t-sql sql-server audit sql-delete

46
推荐指数
4
解决办法
6万
查看次数

如何删除没有临时表的MySQL表中的所有重复记录

我已经看到了很多这方面的变化,但没有什么能与我想要完成的完全匹配.

我有一张表,TableA其中包含用户给出的可配置调查问卷的答案.列是member_id, quiz_num, question_num, answer_num.

不知何故,一些成员得到了两次提交的答案.所以我需要删除重复的记录,但要确保留下一行.

没有列,因此可能有两行或三行都具有完全相同的数据.

是否有查询删除所有重复项?

mysql sql duplicates unique-index sql-delete

45
推荐指数
5
解决办法
11万
查看次数

删除时间戳早于x天的所有行

我想从数据库中的特定表中删除时间戳超过180天的所有行.

我试过这个:

DELETE FROM on_search WHERE search_date < DATE_SUB(NOW(), INTERVAL 180 DAY);
Run Code Online (Sandbox Code Playgroud)

但是删除了所有行,而不仅仅是超过6个月的行.

我在on_search表中有一个名为search_date的列,其中包含创建该行的时间.

search_id   search_term    search_date 
660779      car games      1390052553 
Run Code Online (Sandbox Code Playgroud)

mysql sql-delete

44
推荐指数
2
解决办法
8万
查看次数

在Oracle sql Query中使用"Join"删除

我对Oracle Sql查询并不十分熟悉,因此我在从表中删除某些行时遇到问题,这些行必须满足包含另一个(连接)表的字段的约束.换句话说,我想编写一个查询来删除包括JOIN在内的行.

在我的情况下,我有一个表ProductFilters和另一个表Products连接在一起的表ProductFilters.productID = Products.ID.我想删除高于或等于200 的行,ProductFilters并且ID他们引用的产品名称为"Mark"(名称是Product中的字段).

我想最初通知如果在Oracle的删除查询中JOIN是可接受的.如果不是,我应该如何修改此查询以使其工作,因为在该表单上我收到一个错误:

DELETE From PRODUCTFILTERS pf 
where pf.id>=200 
And pf.rowid in 
(
     Select rowid from PRODUCTFILTERS 
     inner join PRODUCTS on PRODUCTFILTERS.PRODUCTID = PRODUCTS.ID 
     And PRODUCTS.NAME= 'Mark'
);       
Run Code Online (Sandbox Code Playgroud)

sql oracle sql-delete

42
推荐指数
2
解决办法
11万
查看次数

SQL删除特定范围内的记录

对于有经验的人来说,这可能是一个非常简单的问题,但我只是想知道在SQL表中删除特定范围之间的几百条记录的最安全的方法.

例如,我需要删除ID介于79和296之间的行:

我担心的是,如果我说用ID删除所有内容(> 79 AND <296)那么它可能会彻底擦除整个表格.

sql records sql-delete

41
推荐指数
2
解决办法
13万
查看次数