Postgresql

刪除父行時自動設置子行的值?

  • April 16, 2015

描述

我們有一個表格和數據如下:

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;

引用自:https://dba.stackexchange.com/questions/98046