story_category
我的数据库中有一个表有损坏的条目.下一个查询返回损坏的条目:
SELECT *
FROM story_category
WHERE category_id NOT IN (
SELECT DISTINCT category.id
FROM category INNER JOIN
story_category ON category_id=category.id);
Run Code Online (Sandbox Code Playgroud)
我试图删除它们执行:
DELETE FROM story_category
WHERE category_id NOT IN (
SELECT DISTINCT category.id
FROM category
INNER JOIN story_category ON category_id=category.id);
Run Code Online (Sandbox Code Playgroud)
但我得到了下一个错误:
#1093 - 您无法在FROM子句中为更新指定目标表'story_category'
我怎么能克服这个?
我有这个我在PostgreSQL中编写的查询返回错误说:
[错误]错误:第
3行:FROM(选择DISTINCT(可识别)AS made_only_recharge
这是整个查询:
SELECT COUNT (made_only_recharge) AS made_only_recharge
FROM (
SELECT DISTINCT (identifiant) AS made_only_recharge
FROM cdr_data
WHERE CALLEDNUMBER = '0130'
EXCEPT
SELECT DISTINCT (identifiant) AS made_only_recharge
FROM cdr_data
WHERE CALLEDNUMBER != '0130'
)
Run Code Online (Sandbox Code Playgroud)
我在Oracle中有一个类似的查询工作正常.唯一的变化是我EXCEPT
在Oracle中的位置我用MINUS
关键字取代了它.我是Postgres的新手,不知道它的要求.处理这个问题的正确方法是什么?
我正在尝试删除数据库中的孤立帖子并创建了此查询:
DELETE post.*
FROM foro_post AS post
LEFT JOIN foro_thread AS thread USING(threadid)
WHERE thread.threadid IS NULL
Run Code Online (Sandbox Code Playgroud)
问题是我想限制,因为我的表有超过7,000,000条记录.
由于我无法使用LIMIT查询,我尝试了这个并且实际上有效,但我不确定它是否是一个有效的解决方案或者是否可以做得更好.
DELETE post.*
FROM foro_post AS post
LEFT JOIN foro_thread AS thread USING(threadid)
WHERE thread.threadid IS NULL
AND post.postid < 500
// Where < 500 should be increasing as I delete records
Run Code Online (Sandbox Code Playgroud)
我怎样才能更有效地做到这一点?
我想根据主键从中等大小(700K)表中删除大量行。认为,最好的方法应该使用SELECT
-subquery 作为DELETE
源列表。并在这里找到了具体的答案。问题是:它比使用两个单独的查询(首先选择 ID,然后从表中删除这些 ID)慢得多。为什么会这样?
我也做了简单的测试用例:
CREATE TABLE `xyz` (
`xyzID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`col1` int(10) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`xyzID`)
) ENGINE=InnoDB;
Run Code Online (Sandbox Code Playgroud)
用百万条记录填充它,然后:
DELETE FROM xyz
WHERE xyzID IN
(
SELECT xyzID
FROM
(
SELECT xyzID
FROM xyz
LIMIT 3000,1000
) a
);
Query OK, 1000 rows affected (53.52 sec)
Run Code Online (Sandbox Code Playgroud)
删除 2000 行会使时间加倍:
Query OK, 2000 rows affected (1 min 48.25 sec)
Run Code Online (Sandbox Code Playgroud)
但是在没有子查询的情况下删除(首先进行选择)几乎不需要时间(此处由随机生成的 id 列表):
DELETE FROM test.xyz WHERE …
Run Code Online (Sandbox Code Playgroud)