12p*_*hph 7 sql database postgresql database-design cascade
我有以下示例:
Table A
   -some_id
Table B
   -another_id
Table C
   -some_id_fk
   -another_id_fk
我想在级联排Table C如果双方some_id并another_id从各自的表被删除.
当删除两个外键时,如何在表C中自行级联?
如果仅删除其中一个FK,则受影响的行应在引用该外键的列中更改为空值.
我建议使用两个外键约束,ON DELETE SET NULL并使用触发器来处理其余部分
表:
CREATE TABLE a (a_id serial PRIMARY KEY, a text NOT NULL);
CREATE TABLE b (b_id serial PRIMARY KEY, b text NOT NULL);
CREATE TABLE ab (
  ab_id serial PRIMARY KEY
, a_id int REFERENCES a ON DELETE SET NULL
, b_id int REFERENCES b ON DELETE SET NULL
, UNIQUE (a_id, b_id)
);
触发:
CREATE OR REPLACE FUNCTION trg_ab_upbef_nulldel()
  RETURNS trigger AS
$func$
BEGIN
DELETE FROM ab WHERE ab_id = NEW.ab_id;
RETURN NULL;
END
$func$ LANGUAGE plpgsql;
CREATE TRIGGER upbef_nulldel
BEFORE UPDATE OF a_id, b_id ON ab
FOR EACH ROW
WHEN (NEW.a_id IS NULL AND
      NEW.b_id IS NULL)
EXECUTE PROCEDURE trg_ab_upbef_nulldel();
确保连接表具有代理PK列.(a_id, b_id)无论如何都不能成为PK,因为这两者都不允许使用NULL.改为添加UNIQUE约束,允许使用NULL值.
触发器针对性能进行了优化,仅在两个FK列中的一个更新时启动,并且仅在两者都导致时才启动NULL.
触发器函数很简单:删除行并返回NULL以取消现在的void级联UPDATE.
| 归档时间: | 
 | 
| 查看次数: | 6742 次 | 
| 最近记录: |