簡體   English   中英

Postgres:刪除所有表格或級聯刪除?

[英]Postgres: delete all tables or cascade a delete?

是否可以使用postgres中的單個命令刪除所有表中的所有行(不破壞數據庫),或者在postgres中級聯刪除?

如果沒有,那么如何重置我的測試數據庫?

是否可以使用postgres中的單個命令刪除所有表中的所有行

你是對的,答案是肯定的

您可以定義級聯外鍵,如果刪除“父級”,將刪除所有引用行。 但這是外鍵的屬性,您無法使用DELETE語句指定任何內容

如果不是 - 哇。

那是什么意思?

第二個想法:你想要實現什么?

我懷疑你正試圖“重置”例如測試數據庫。 在這種情況下,PostgreSQL方法將是:

  • 創建一個包含新數據庫中所需的所有內容(表,視圖,索引等)的數據庫(稱為my_template)
  • 要重置當前的test-DB,請執行DROP DATABASE testdb ,然后使用CREATE DATABASE testdb TEMPLATE my_template重新創建測試數據庫CREATE DATABASE testdb TEMPLATE my_template

新創建的testdb將在my_template中定義所有表。 這也許不是刪除所有行快了很多

您可以編寫一個存儲過程來選擇所有模式中的所有表,然后對這些表執行DELETE CASCADE或TRUNCATE。 它只是幾行pl / pgsql代碼,沒什么大不了的。

編輯:這將成功,但要小心!

CREATE OR REPLACE FUNCTION truncate_all() RETURNS void LANGUAGE plpgsql AS
$$
DECLARE
    row record;
    query   text;
BEGIN
    query := 'SELECT table_schema, table_name FROM information_schema.tables WHERE table_schema NOT IN(''pg_catalog'', ''information_schema'') AND table_type = ''BASE TABLE''';

    FOR row IN EXECUTE query LOOP
        EXECUTE 'TRUNCATE ' || quote_ident(row.table_schema) || '.' || quote_ident(row.table_name) || ' CASCADE;';
    END LOOP;

    RETURN;
END;
$$;

-- execute:
SELECT truncate_all();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM