簡體   English   中英

刪除表單表不起作用psql

[英]Delete form table doesn't work psql

因此,我當前正在使用PostgreSQL(10.4),需要在數據庫中模擬“文件系統”。 為了實現此目標,我有兩個表:

-- represent a directory
CREATE TABLE USERS_DIRECTORIES
(
    id                  SERIAL          NOT NULL,
    users_id            INTEGER         NOT NULL,
    name                VARCHAR(64)     NOT NULL,
    description         VARCHAR(64)     NOT NULL DEFAULT '',
    created_at          TIMESTAMP WITH TIME ZONE        NOT NULL DEFAULT NOW(),
    UNIQUE(users_id, name),
    PRIMARY KEY (id),
    FOREIGN KEY (users_id) REFERENCES USERS(id)
);

-- represent links between a directory and its sub-directories
CREATE TABLE SUB_DIRECTORIES
(
    id                  SERIAL          NOT NULL,
    -- parent directory
    parent_id           INTEGER,
    -- sub directory
    child_id            INTEGER         NOT NULL,
    created_at          TIMESTAMP WITH TIME ZONE        NOT NULL DEFAULT NOW(),
    PRIMARY KEY (id),
    FOREIGN KEY (parent_id) REFERENCES USERS_DIRECTORIES(id),
    FOREIGN KEY (child_id) REFERENCES USERS_DIRECTORIES(id) ON DELETE CASCADE
);

當我需要刪除目錄時,會發生此問題。 為了正確執行此操作,我需要刪除所有子目錄。

當前解決方案

要刪除子目錄,我需要在“ SUB_DIRECTORIES”表中刪除其引用,以免觸發外鍵異常。 為了解決這個問題,我使用了兩個觸發過程。

-- triggered when I delete a directory to delete a reference 
CREATE OR REPLACE FUNCTION delete_reference()
RETURNS TRIGGER AS
$$
BEGIN
   raise notice 'OLD: %', OLD.id;
   DELETE FROM sub_directories WHERE parent_id = OLD.id;
   IF FOUND THEN 
      raise notice 'SUCESS id : %', OLD.id;
   END IF;
   RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER on_delete_sub_references BEFORE DELETE ON users_directories
    FOR EACH ROW
    EXECUTE PROCEDURE delete_reference();

-- triggered when I delete a reference to delete all sub directories
CREATE OR REPLACE FUNCTION delete_refered()
RETURNS TRIGGER AS
$$
BEGIN
    raise notice 'OLD child: %', OLD.child_id;
    DELETE FROM users_directories WHERE id = OLD.child_id;
    IF FOUND THEN 
         raise notice 'SUCESS child_id : %', OLD.child_id;
    END IF;
    RETURN NEW;
EXCEPTION
    WHEN OTHERS THEN
        raise notice 'EXCEPTION';
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER on_delete_sub_refered AFTER DELETE ON sub_directories
    FOR EACH ROW
    EXECUTE PROCEDURE delete_refered();

每當我刪除目錄時,它都會觸發“ delete_reference()”函數,該函數將從表“ SUB_DIRECTORIES”中刪除該目錄的所有引用;當我從同一張表中刪除引用時,它會觸發“ delete_refered()”函數,該函數將刪除sub_directories並不斷進行下去。

問題

一切正常,除了在表“ USERS_DIRECTORIES”中未刪除任何數據外。 在“ SUB_DIRECTORIES”表中已正確刪除了引用。 盡管我嘗試“手動”刪除表“ USERS_DIRECTORIES”中的特定行(“從...中刪除,其中id = ..”),但最終以“ DELETE 0”結尾,並帶有正確的查詢和ID。

經過很多時間向Google尋求解決方案后,我沒有發現有關我的問題的任何信息。 此外,我不是英語為母語的人,因此很難找到定義我的問題的關鍵詞。 如果有人可以幫助我,我將非常感激。

PS:如果有幫助,我也可以說法語。

RETURN OLD; 對於DELETE觸發器之前(此操作有誤),請RETURN NEW; 用於“刪除后”。

您還可以在AFTER DELETE觸發器中使用OLD ,因此最安全的方法是始終在DELETE觸發器中返回OLD

暫無
暫無

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

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