【问题标题】:Delete data (but not structure) of a Postgres database with a SQL query?使用 SQL 查询删除 Postgres 数据库的数据(但不是结构)?
【发布时间】:2020-11-17 20:57:59
【问题描述】:

我正在使用 Postico 客户端,它允许我为我的 Postgres 数据库编写 SQL 查询。我没有终端访问权限。

在开发过程中,我经常需要擦除所有数据,这非常耗时。有没有可以做到这一点的命令?

我试过了,但出现语法错误:

DELETE FROM *
WHERE *

我也试过DELETE FROM tbl;TRUNCATE TABLE;

更新:如果我运行这个命令:

SELECT table_name
  FROM information_schema.tables
 WHERE table_schema='public'
   AND table_type='BASE TABLE';

然后我有大约 30 个表,因此必须运行任何命令 30 次仍然非常耗时。

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    您可以生成单个 TRUNCATE 语句:

    SELECT 'truncate table '||
              string_agg(format('%I.%I', table_schema, table_name), ',')||
              ' cascade restart identity;'
    FROM information_schema.tables
    WHERE table_schema='public'
      AND table_type='BASE TABLE';
    

    然后只需复制并粘贴生成的语句即可运行它。


    您还可以使用使用动态 SQL 的 DO 块来运行 TRUNCATE 语句:

    do
    $$
    declare
      l_sql text;
    begin
      SELECT 'truncate table '
                ||string_agg(format('%I.%I', table_schema, table_name), ',')
                ||' cascade restart identity'
         into l_sql
      FROM information_schema.tables
      WHERE table_schema='public'
        AND table_type='BASE TABLE';
    
      execute l_sql;
    end;
    $$
    ;
    

    通过在单个语句中截断所有表,您无需担心截断它们的顺序。

    请注意,如果您有很多表,您可能需要增加 max_locks_per_transaction 才能使其正常工作。

    【讨论】:

      【解决方案2】:

      语法不正确。您需要运行:

      DELETE FROM tablename
      WHERE columnname = 'value';
      

      截断速度更快,因为它会立即从表中删除所有数据。其语法是:

      TRUNCATE tablename;
      

      【讨论】:

      • 我更新了我的问题。我有大约 30 个表,因此必须执行 30 次命令将非常耗时。有没有一个可以工作的命令?
      【解决方案3】:

      没有单一的命令,您必须编写一个脚本,以正确的顺序TRUNCATEs 所有表(并且不要忘记重置序列)。

      另一种方法是使用pg_dump 创建这样的脚本:

      pg_dump -s --clean -f script.sql dbname
      

      该脚本将删除并重新创建所有对象。

      【讨论】:

        猜你喜欢
        • 2013-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多