在数据库方面,我是一个相对新手.我们正在使用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) 我有一个使用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
这是怎么造成的,我该如何解决?
我为最近遇到的错误整理了一个测试表.它涉及在尝试从MySQL表中删除单个记录时使用LIMIT.
我说的错误是" 你的SQL语法有错误;检查与你的MySQL服务器版本相对应的手册,以便在第1行的'LIMIT 1'附近使用正确的语法 "
我放在一起的表叫做测试 ; 它有3列,id,name和created.我用几个记录填充了表,然后尝试删除一个.以下是我过去尝试完成此操作的声明.
DELETE t FROM test t WHERE t.name = 'foo' LIMIT 1
如果不使用LIMIT 1,语句执行得很好,但是如果不需要它,我当然不会使用LIMIT.
我完全知道我可以使用另一个语句来成功完成此DELETE.见下文:
DELETE FROM test WHERE name = 'foo' LIMIT 1
但是我的问题集中在为什么第一个声明不适用于LIMIT.
所以我的问题是,对于生成此错误的第一个语句,我做错了什么?
我试图用外键截断一个表并得到消息:
" 无法截断表,因为它正被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)
它没有给出错误并且正常工作.我想从表中删除所有信息并添加新信息,但我不想删除并创建外键.
在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)
这实际上失败了,语法错误.
有任何想法吗?
我已经看到了很多这方面的变化,但没有什么能与我想要完成的完全匹配.
我有一张表,TableA其中包含用户给出的可配置调查问卷的答案.列是member_id, quiz_num, question_num, answer_num.
不知何故,一些成员得到了两次提交的答案.所以我需要删除重复的记录,但要确保留下一行.
没有主列,因此可能有两行或三行都具有完全相同的数据.
是否有查询删除所有重复项?
我想从数据库中的特定表中删除时间戳超过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) 我对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表中删除特定范围之间的几百条记录的最安全的方法.
例如,我需要删除ID介于79和296之间的行:
我担心的是,如果我说用ID删除所有内容(> 79 AND <296)那么它可能会彻底擦除整个表格.
sql-delete ×10
mysql ×5
sql ×5
audit ×1
c# ×1
duplicates ×1
jpa ×1
limit ×1
oracle ×1
performance ×1
records ×1
rollback ×1
sql-server ×1
t-sql ×1
truncate ×1
unique-index ×1