arantius
asked on
MySQL "on delete cascade" doesn't appear to work.
After I set up a test database:
CREATE TABLE hit (
id int(10) unsigned NOT NULL auto_increment,
visitorId int(10) unsigned NOT NULL,
PRIMARY KEY (id),
KEY visitorId (visitorId)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO hit (id, visitorId) VALUES
(1, 1),
(2, 2),
(3, 3);
CREATE TABLE visitor (
id int(10) unsigned NOT NULL auto_increment,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO visitor (id) VALUES
(1),
(2),
(3);
ALTER TABLE hit ADD FOREIGN KEY (visitorId) REFERENCES visitor(id) ON DELETE CASCADE;
I get:
mysql> select * from hit;
+----+-----------+
| id | visitorId |
+----+-----------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+----+-----------+
3 rows in set (0.00 sec)
mysql> select * from visitor;
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
+----+
3 rows in set (0.00 sec)
When I:
mysql> delete from hit where id=2;
Query OK, 1 row affected (0.00 sec)
mysql> select * from hit;
+----+-----------+
| id | visitorId |
+----+-----------+
| 1 | 1 |
| 3 | 3 |
+----+-----------+
2 rows in set (0.00 sec)
mysql> select * from visitor;
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
+----+
3 rows in set (0.00 sec)
The delete doesn't cascade to the visitor table. Why not?
CREATE TABLE hit (
id int(10) unsigned NOT NULL auto_increment,
visitorId int(10) unsigned NOT NULL,
PRIMARY KEY (id),
KEY visitorId (visitorId)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO hit (id, visitorId) VALUES
(1, 1),
(2, 2),
(3, 3);
CREATE TABLE visitor (
id int(10) unsigned NOT NULL auto_increment,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO visitor (id) VALUES
(1),
(2),
(3);
ALTER TABLE hit ADD FOREIGN KEY (visitorId) REFERENCES visitor(id) ON DELETE CASCADE;
I get:
mysql> select * from hit;
+----+-----------+
| id | visitorId |
+----+-----------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+----+-----------+
3 rows in set (0.00 sec)
mysql> select * from visitor;
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
+----+
3 rows in set (0.00 sec)
When I:
mysql> delete from hit where id=2;
Query OK, 1 row affected (0.00 sec)
mysql> select * from hit;
+----+-----------+
| id | visitorId |
+----+-----------+
| 1 | 1 |
| 3 | 3 |
+----+-----------+
2 rows in set (0.00 sec)
mysql> select * from visitor;
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
+----+
3 rows in set (0.00 sec)
The delete doesn't cascade to the visitor table. Why not?
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Well, I don't think we can use on delete cascade here. Probably what you can do is to periodically check the visitor table and delete records which don't have child records.
ASKER
Is there a straightforward way to do this?