我正在运行一个归档脚本,它根据输入的日期从大型(~50m记录DB)中删除行.日期字段是表上的聚集索引,因此我正在应用我的条件语句.
我在while循环中运行此删除,尝试批量处理1000到100,000条记录.无论批量大小,它都非常缓慢; 像10,000条记录一样被删除一分钟.查看执行计划,"索引删除"花费了大量时间.表中大约有15个字段,其中大约有10个字段具有某种索引.有什么方法可以解决这个问题吗?我甚至不确定为什么每个索引删除都需要这么长时间,有人可以了解到这里发生了什么?这是我执行计划的一个示例:
alt text http://img94.imageshack.us/img94/1006/indexdelete.png
(序列指向删除命令)
这个数据库是实时的,并且经常被插入,这就是为什么我对使用修剪大小的复制和截断方法犹豫不决.我在这里还有其他选择吗?
这是我正在使用的查询:
SELECT k_id, COUNT(k_id) AS k_count
FROM template_keyword_link
WHERE k_id IN(1,2,3,4,5)
GROUP BY k_id;
Run Code Online (Sandbox Code Playgroud)
此查询返回类似
1 |的内容 6
2 | 1
3 | 4
4 | 1
5 | 9
我想添加类似的东西AND COUNT(k_id) = 1
我最终得到
2 | 1
4 | 1
但是我无效使用组功能.
我该怎么做呢?
我的问题的另一部分是.
这可以用作删除语句吗?
就像是
DELETE FROM
template_keyword_link tkl
LEFT JOIN keywords k
ON tkl.k_id = k.k_id
WHERE tkl.k_id
IN(SELECT k_id, COUNT(k_id) AS k_count
FROM template_keyword_link
WHERE k_id IN(1,2)
GROUP BY k_id
HAVING k_count = 1);
Run Code Online (Sandbox Code Playgroud)
我明白了 …
假设我正在运行导入的一半,而不是运行
SELECT COUNT(*) FROM table_being_imported
Run Code Online (Sandbox Code Playgroud)
我点击ctrl+ R,键入table_being_im并点击返回,只是为了发现我刚刚发布的恐怖事件
DELETE FROM table_being_imported
Run Code Online (Sandbox Code Playgroud)
哎呀.所以我点击ctrl+ C并得到告诉:
Ctrl-C -- sending "KILL QUERY 627" to server ...
Ctrl-C -- query aborted.
ERROR 1317 (70100): Query execution was interrupted
Run Code Online (Sandbox Code Playgroud)
它会删除任何行吗?只是假设,当然......
码:
create table coltype (coltype varchar(5));
insert into coltype values ('typ1');
create table colsubtype (coltype varchar(5), colsubtype varchar(5));
insert into colsubtype values ('typ2', 'st1');
insert into colsubtype values ('typ2', 'st2');
create table table1 (col1 varchar(5), coltype varchar(5), colsubtype varchar(5));
insert into table1 values ('val1','typ1', 'st1');
insert into table1 values ('val2','typ1', 'st2');
insert into table1 values ('val3','typ1', 'st3');
insert into table1 values ('val4','typ2', 'st1');
insert into table1 values ('val5','typ2', 'st2');
insert into table1 values ('val6','typ2', 'st3');
insert into table1 values ('val7','typ3', …Run Code Online (Sandbox Code Playgroud) 我正在使用MySQL 5.0,我想知道是否有办法禁用表上的删除.如同,不能让任何用户从平板电脑中删除任何内容,只更新和插入.
DELETE
FROM processing_transaction AS pt
INNER JOIN processing_transaction_movement AS ptm
ON pt.processing_transaction_id = ptm.processing_transaction_id
LEFT OUTER JOIN test_package tesp ON pt.test_package_id = tesp.test_package_id
LEFT OUTER JOIN test_batch tbat On tesp.test_batch_id = tbat.test_batch_id
WHERE pt.processing_transaction_type = 'TEST';
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
错误:语法错误>> INNER << LINE 1:DELETE FROM processing_transaction AS pt INNER JOIN processi ...
请问你能帮我找到我的SQL查询中的错误
感谢您的支持@desislavkamenov @jan.现在我用这个:
开始工作;
DELETE FROM processing_transaction AS pt USING processing_transaction_movement AS ptm,test_package tesp,test_batch tbat WHERE pt.processing_transaction_type ='TEST'; AND pt.processing_transaction_id = ptm.processing_transaction_id AND pt.test_package_id = tesp.test_package_id AND tesp.test_batch_id …
我有1个MySQL表.它看起来像这样:
+---------+-------------+--------+
| item_id | parent_id | Name |
+---------+-------------+--------+
| 1 | 0 | Home |
+---------+-------------+--------+
| 2 | 1 | Sub |
+---------+-------------+--------+
| 3 | 2 | SubSub |
+---------+-------------+--------+
Run Code Online (Sandbox Code Playgroud)
如果我删除item_id 1,我想删除子的其余部分,但我该怎么办呢?
我已经尝试过外键但只有你有2个表才有效吗?
我希望有人可以帮助我在MySQL中使用PHP吗?
我目前正在尝试从表A中删除表B中未使用相应记录的情况.表A包含Section,SubSection,Code,Text作为字段,其中前三个是主键.表B将ID,Section,SubSection,Code作为字段,其中所有四个都是主键.有更多的列,但它们与这个问题无关...只是想在我被问及为什么所有列都是表B的主键的一部分之前指出它.很多表A是所有可能数据的存储库可以分配给实体,表B是它们被分配的位置.我想删除表A中未在表B中使用的所有记录.我尝试了以下操作但没有成功:
DELETE FROM Table A
WHERE NOT EXISTS (SELECT * from Table B
WHERE A.section = B.section
AND A.subsection = B.subsection
AND A.code = b.code)
Run Code Online (Sandbox Code Playgroud)
如果我执行Select而不是删除,我会得到我要查找的子集,但是当我执行删除时,我得到一个错误,表示表A中存在语法错误.我会使用NOT IN语句,但是多列是主键的一部分,我只是看不出它是如何工作的.任何帮助将不胜感激.
在MySQL中,如果我正在执行一个DELETE或UPDATE在同一个表上,我不能在谓词中重用表.例如,这是不可能的:
DELETE FROM story_category WHERE category_id NOT IN (
-- ^^^^^^^^^^^^^^ deleting from this table...
SELECT DISTINCT category.id FROM category
INNER JOIN story_category ON category_id=category.id);
-- ^^^^^^^^^^^^^^ ... prevents using the same table in predicates
Run Code Online (Sandbox Code Playgroud)
上面的例子来自这个Stack Overflow问题,其中接受的答案和许多其他答案指出,通过将子查询嵌套到另一个子查询中以使MySQL无法识别表重用,可以使用一种技巧:
DELETE FROM story_category
-- ^^^^^^^^^^^^^^
WHERE category_id NOT IN (
SELECT cid FROM (
SELECT DISTINCT category.id AS cid FROM category
INNER JOIN story_category ON category_id=category.id
-- ^^^^^^^^^^^^^^ apparently no longer considered the same table
) AS …Run Code Online (Sandbox Code Playgroud) 我有一个包含大量重复量的数据库,每有一个独特的ID,但它们的PermitID和EncID是相同的.我需要删除数据库中除最高ID之外的所有ID.
sql语句,
DELETE FROM tblInvoices
WHERE EncID = '0237' AND PermitID IN (
SELECT Max(ID) FROM tblInvoices Group BY PermitID)
Run Code Online (Sandbox Code Playgroud)
删除所有记录.我试过了
DELETE FROM tblInvoices
WHERE EncID = '0237' AND PermitID
< (SELECT Max(ID) FROM tblInvoices Group BY PermitID)
Run Code Online (Sandbox Code Playgroud)
但我收到错误
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
数据的一个例子是
ID PermitID EncID
1 …Run Code Online (Sandbox Code Playgroud) sql-delete ×10
mysql ×5
sql ×4
sql-server ×3
children ×1
exists ×1
join ×1
not-exists ×1
optimization ×1
parent ×1
php ×1
postgresql ×1
sql-update ×1