[
https://issues.apache.org/jira/browse/DERBY-7120?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Richard N. Hillegas updated DERBY-7120:
---------------------------------------
Urgency: Normal
> Self-referential ON DELETE SET NULL
> -----------------------------------
>
> Key: DERBY-7120
> URL: https://issues.apache.org/jira/browse/DERBY-7120
> Project: Derby
> Issue Type: Improvement
> Components: SQL
> Reporter: John English
> Priority: Major
> Attachments: demo.sql
>
>
> I have a table in which I want to include a self-referential foreign key to
> the same table:
> {code:java}
> CREATE TABLE x (
> id INTEGER PRIMARY KEY
> );
> CREATE TABLE y (
> id INTEGER PRIMARY KEY,
> id_x INTEGER,
> id_y INTEGER,
> CONSTRAINT y1 FOREIGN KEY (id_x)
> REFERENCES x(id)
> ON DELETE CASCADE,
> CONSTRAINT y2 FOREIGN KEY (id_y)
> REFERENCES y(id)
> ON DELETE SET NULL
> );
> {code}
> When I try this I get the following error:
> Error: Foreign Key 'Y2' is invalid because 'The delete rule of foreign key
> must be CASCADE. (The referential constraint is self-referencing and the
> table is dependent in a relationship with a delete rule of CASCADE.)'.
> SQLState: 42915
> ErrorCode: 30000
> I have worked around this for now by removing the foreign key constraint and
> using a trigger:
> {code:java}
> CREATE TRIGGER set_null
> AFTER DELETE ON y
> REFERENCING OLD AS del
> FOR EACH ROW MODE DB2SQL
> UPDATE y SET id_y = NULL WHERE id_y = del.id;
> {code}
> The problem is that id_y is no longer constrained to be a foreign key, and
> other approaches, e.g. CHECK (id_y IN (SELECT id FROM y)), don't work either.
> The same code works well in other DBMSs (even MySQL!). Demo code is attached.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)