Fraser,

----- Original Message ----- 
From: "Fraser Hanson" <[EMAIL PROTECTED]>
Newsgroups: mailing.database.mysql
Sent: Wednesday, August 06, 2003 5:46 AM
Subject: ON UPDATE CASCADE fails


> Hello,
>
> I have a table which has a foreign key relationship with itself.  I
> want and expect my updates to cascade (deletes definitely cascade as
> expected) but instead I just get error 1217: foriegn key error.
>
> I have written example code to use in reproducing the problem:
>
>
> # Create the table
> drop TABLE IF EXISTS person;
> create table person (
> name VARCHAR(50) NOT NULL,
>     parent VARCHAR(50) NOT NULL,
>     INDEX parent_ind(parent),
>     FOREIGN KEY(parent)
>     REFERENCES person(name) # this makes it so that when a page is
deleted/updated, so are all it's sub-pages
>     ON DELETE CASCADE ON UPDATE CASCADE,
>     PRIMARY KEY (name)
> ) TYPE=INNODB;
>
> # Insert some example data
> INSERT INTO person (name,parent) VALUES ('Grandpa', 'Grandpa');
> INSERT INTO person (name,parent) VALUES ('John', 'Grandpa');
> INSERT INTO person (name,parent) VALUES ('Baby Bob', 'John');
>
> mysql> select * from person;
> +----------+---------+
> | name     | parent  |
> +----------+---------+
> | Grandpa  | Grandpa |
> | John     | Grandpa |
> | Baby Bob | John    |
> +----------+---------+
>
> # Attempt the update (this fails with error  1217)
> UPDATE person SET name='Mary' where name='John';
> # I expect to end up with these values:
> mysql> select * from person;
> +----------+---------+
> | name     | parent  |
> +----------+---------+
> | Grandpa  | Grandpa |
> | Mary     | Grandpa |
> | Baby Bob | Mary    |
> +----------+---------+
>
> I have verified that deletes cascade as expected.

http://www.innodb.com/ibman.html#InnoDB_foreign_keys

"
A deviation from SQL standards: if ON UPDATE CASCADE or ON UPDATE SET NULL
recurses to update a table for which there already is an update operation in
the stack of cascaded operations, it acts like RESTRICT. In plain English
this means that you cannot use self-referential ON UPDATE CASCADE or ON
UPDATE SET NULL operations. This is to prevent infinite loops resulting from
cascaded updates. A self-referential ON DELETE SET NULL, on the other hand,
works starting from 4.0.13. A self-referential ON DELETE CASCADE has always
worked.
"

InnoDB does not check what rows it has already updated during the SQL
statement. To prevent infinite recursions I let it simply check if it
recurses to the same table.

Since you normally do not update the primary key of a row, ON UPDATE CASCADE
is seldom used in well-designed schemas.

> Any help is greatly appreciated,
> --Fraser Hanson

Best regards,

Heikki Tuuri
Innobase Oy
http://www.innodb.com
Transactions, foreign keys, and a hot backup tool for MySQL
Order MySQL technical support from https://order.mysql.com/



-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to