正如標題所描述的,我想建立一種zero-or-one到zero-or-one的關系。例如,假設我們有兩個表Calls和Files。通話中可能會有一個附件,反之亦然。但我有一個限制。我希望如果我刪除一個調用,它的文件也會被刪除,但如果我刪除它的文件調用,它應該保持原樣。SQL約束(如ON DELETE CASCADE
/ON DELETE SET NULL
)是否可以這樣做?或者,是否有任何方法可以在不使用觸發器/事件的情況下,使用SQL在數據庫中實現這樣的行為?
我嘗試了以下內容:
-- Create the 'files' table
CREATE TABLE files (
id SERIAL PRIMARY KEY, -- Primary key for the 'files' table
file_name TEXT NOT NULL -- Any additional fields for the 'files' table
);
-- Create the 'calls' table
CREATE TABLE calls (
id SERIAL PRIMARY KEY, -- Primary key for the 'calls' table
file_id INT UNIQUE, -- Foreign key referencing 'files' table (1-1 relationship)
call_description TEXT, -- Any additional fields for the 'calls' table
CONSTRAINT fk_file_id FOREIGN KEY (file_id) REFERENCES files(id) ON DELETE SET NULL
);
-- Add an additional constraint on the 'files' table to enforce the cascading behavior
ALTER TABLE files
ADD CONSTRAINT fk_call_file
FOREIGN KEY (id)
REFERENCES calls(file_id)
ON DELETE CASCADE;
但由于約束立即執行,因此它需要可推遲。而且,這也不是我的本意。我希望一個調用/文件存在,彼此之間沒有依賴關系。
在這種情況下,應該遵循哪些最佳實踐?
我會選擇簡單的方法: