Postgresql
刪除父行時自動設置子行的值?
描述
我們有一個表格和數據如下:
Version: PostgreSQL 9.3 Table name: tree_data (id int, code text, name text, parent_id int) Primary key: id Foreign key: parent_id (refer to id)
和數據:
insert into tree_data (id, code, name, parent_id) values (1, 'aaa','aaa', null); insert into tree_data (id, code, name, parent_id) values (2, 'bbb','bbb', 1); insert into tree_data (id, code, name, parent_id) values (3, 'ccc','ccc', 1); id | code | name | parent_id 1 aaa aaa null 2 bbb bbb 1 3 ccc ccc 1
這裡是我們想要的查詢和結果,意思是:刪除 id = 1(父行)時,表會自動在子行(第一級)設置 parent_id = null 。
delete from tree_data where id = 1 ; ----> rows after deleting: id | code | name | parent_id 2 bbb bbb null 3 ccc ccc null
我們的問題:
我們可以使用 postgresql 約束來做到這一點嗎?如果沒有,我們該怎麼辦?
create table tree_data ( id integer primary key, code text, name text, parent_id integer, constraint fk_parent foreign key (parent_id) references tree_data(id) on delete set null );
SQLFiddle 範例:http ://sqlfiddle.com/#!15/b9a62/1
在 postgres 中創建外鍵時,設置
ON DELETE SET NULL
.ALTER TABLE public.tree_data ADD CONSTRAINT tree_data_id_fkey FOREIGN KEY (parent_id) REFERENCES tree_data(id) ON DELETE SET NULL;