我希望删除我们数据库中的大量数据,我们现在不确定将删除的数据放在哪里,但我们正在寻找一个单独的副本。
我最初探索了使用 CTE,但对于将 CTE 用于如此大的数据存在一些担忧,因此选择了临时表,但很难让它工作。
我还尝试将其包装在事务中,以便我们可以选择回滚:
begin; -- typically faster and safer wrapped in a single transaction
CREATE TEMP TABLE tmpold AS ( ERROR: syntax error at or near "t" Position: 51)
SELECT t.*
--into temporary table tmpold (also tried this but ERROR: syntax error at or near "t" Position: 51
FROM play t
where t.play_created_on > NOW() - interval '1 years';
delete t.* from play t
inner join tmpold on t.play_id = tmpold.play_id;
select count (*) from tmpold
ROLLBACK;
无法理解为什么它不起作用,我想从播放表中选择一组值到临时表中,然后使用临时表中的值从播放表中删除数据。
不确定临时表是否正确,我想将播放表中删除的数据保留在一个单独的表中,直到我们决定如何处理它。
你需要改变很多事情。
临时表不是您想要的,一旦创建它们的连接关闭,它们就会被删除,并且无法从任何其他连接访问它们。请改用常规表。
您在 CREATE TABLE AS 语句中有一个不需要的左括号(即未闭合);只是
CREATE TABLE <tblname> AS <SELECT statement>
,不是CREATE TABLE <tblname> AS (<SELECT statement>)
。您的删除语法在两个方面是错误的。首先,您选择要删除的行,而不是列,这意味着您只是
DELETE FROM (tablename) as (alias)
,而不是DELETE (alias).* FROM (tablename) as (alias)
。其次,像这样的常规 JOIN 语法用于 SELECT 语句,而不是 DELETE*;相反,在 WHERE 中使用子选择,规划器将设置所需的连接,例如:*Caveat -如果它也有一个 USING,则可以有一个常规的 JOIN 子句,但这里不需要它。
DELETE
另一件事对我来说看起来很奇怪,但可能符合预期 - 通常在这种情况下,目的是将旧记录移出主表。最初的 CREATE TABLE AS SELECT 上的 WHERE 子句会将最近一年的记录移出主表,同时保留所有旧记录。如果这不是意图,您可能想更改
t.play_created_on > NOW() - interval '1 years'
为t.play_created_on <= NOW() - interval '1 years'