Toon posts:

[InnoDB]Foreign key binnen tabel

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik maak gebruik van InnoDB om de database integriteit te behouden zonder dat handmatig in de scripts te hoeven doen. Maar op 1 punt kom ik op een probleem. Het gaat om een tabel met daarin: id, parent_id, rest velden.

De bedoeling is dus dat zodra record met id 1 verwijderd wordt, alle records waar parent_id 1 is ook verwijderd worden (en hun childs ook weer..) Wat ik dus eigenlijk zoek is een foreign key, die niet foreign is :) ofzo.

Ik heb wel gewoon een foreign key kunnen binnen de tabel. Echter na handmatig een eerste record te hebben toegevoegd (FK checks uit anders gaat het niet) kan ik niets meer toevoegen. Ondanks dat de FK bestaat, krijg ik steeds de error dat relatie niet gelegd kan worden.

Op deze manier is het dus niet te maken, is er misschien een andere manier? Dit is toch geen vreemde constructie (parent - child), moet vast vaker voorkomen.

  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 07-07 11:51
Misschien lukt dit: Koppeltabel maken met de velden ParentID, ChildID. Twee FK's naar de PK van de andere tabel.

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


Verwijderd

Topicstarter
Dat is een vrij simpele oplossing waar ik nog niet eens aan gedacht heb :) Dat moet zeker wel werken ja. Dat wordt dan alvast de reserve oplossing.
Maar ik ben toch wel benieuwd of er voor de structuur zoals die nu is ook een oplossing is.

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Ook dit is een foreign key hoor :)

In principe moet je dus gewoon zoiets kunnen maken:
create table tabel
(
id int primary key not null,
parent_id int references tabel(id),
...
);

Hoe het precies met innodb moet weet ik niet, want dan zit je met je extra indices enzo (op parent_id eentje zeker?)

Verwijderd

Topicstarter
Ik heb het nog eens snel op een simpel tabelletje getest maar het werkt echt niet:
code:
1
2
3
4
5
6
7
CREATE TABLE `innotest` (
  `id` tinyint(3) unsigned NOT NULL auto_increment,
  `parent_id` tinyint(3) unsigned NOT NULL default '0',
  PRIMARY KEY  (`id`),
  KEY `parent_id` (`parent_id`),
  FOREIGN KEY (`id`) REFERENCES `innotest` (`parent_id`) ON DELETE CASCADE
) TYPE=InnoDB;

Daarna een eerste rij invoegen met behulp van "SET FOREIGN_KEY_CHECKS=0" en dan een rij toevoegen met parent 1...... error :(

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

parent id moet wel null mogen zijn natuurlijk :)

Zo werkt het prima:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
create table innotest (
 id tinyint primary key not null,
 parent_id tinyint,
 key(parent_id),
 foreign key (parent_id) references innotest(id)
) type=InnoDB;

mysql> insert into innotest (id) values (1);
Query OK, 1 row affected (0.05 sec)

mysql> insert into innotest (id, parent_id) values (2, 2);
Query OK, 1 row affected (0.00 sec)

mysql> select * from innotest;
+----+-----------+
| id | parent_id |
+----+-----------+
|  1 |      NULL |
|  2 |         2 |
+----+-----------+
2 rows in set (0.00 sec)

mysql> insert into innotest (id, parent_id) values (3, 5);
ERROR 1216: Cannot add a child row: a foreign key constraint fails

En je hebt je foreign key een beetje verkeerdom :o

[ Voor 91% gewijzigd door ACM op 25-06-2003 13:42 ]


  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 14-07 14:28

thomaske

» » » » » »

Je foreign key moet natuurlijk andersom:

code:
1
FOREIGN KEY (`parent_id`) REFERENCES `innotest` (`id`) ON DELETE CASCADE


zoals ACM zegt jah ;)

[ Voor 12% gewijzigd door thomaske op 25-06-2003 13:48 ]

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


Verwijderd

Topicstarter
|:( tijd voor een kop koffie denk ik. Bedankt in ieder geval, dat was een wel heel stomme fout :o
Pagina: 1