Toon posts:

[MySQL/InnoDB] Niet verplichte foreign key

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

Ik heb ooits eens een menu gemaakt vanuit een "voorbeeld" op internet. Ergens van sitepoint dacht ik. Over een tree in 1x uit lezen.

Edit:
deze link: http://www.sitepoint.com/article/hierarchical-data-database

Nu was ik er weer mee bezig en heb ik inmiddels een andere (nieuwere) MySQL draaien, waarmee ik ook InnoDB kan.

Mooi dacht ik, nu kan ik de dus "sub menu" foreign key's maken naar hun parents.

Ik probeerde deze sql:
code:
1
2
3
4
5
6
7
8
9
CREATE TABLE `Menu` (
`MenuID` int( 11 ) NOT NULL AUTO_INCREMENT ,
`ParentMenu` int( 11 ) default NULL REFERENCES `Menu` (`MenuID`) ON DELETE CASCADE ON UPDATE no ACTION ,
`Title` varchar( 20 ) NOT NULL default '',
`Active` smallint( 6 ) NOT NULL default '0',
`Lft` smallint( 6 ) default '0',
`Rgt` smallint( 6 ) default '0',
PRIMARY KEY ( `MenuID` ) 
) ENGINE = InnoDB ;


Dit ging als eerste al "fout", omdat de constraint niet werd aan gemaakt :S.

Deze heb ik dus zelf nog een toegevoegd:
code:
1
2
ALTER TABLE `Menu`
  ADD CONSTRAINT `Menu_ibfk_1` FOREIGN KEY (`MenuID`) REFERENCES `Menu` (`MenuID`) ON DELETE CASCADE ON UPDATE NO ACTION;


Echter geeft me dit niet het gewenste resultaat. Ik kan geen menu items aanmaken met een "null" parent. Wat volgens mij met deze tabel opmaak moet mogen. Tenminste in sql-server moet het zo werken dacht ik...

In de help van MySQL staat nog iets van "[MATCH FULL | MATCH PARTIAL | MATCH SIMPLE]". Ik weet niet of dit hier iets mee te maken heeft.

Weet iemand of dit mogelijk is, of wat ik verkeerd doe?
Ik wil een niet verplichte foreign key hebben. Dus de waarde moet NULL zijn, of voorkomen als primary key.

[ Voor 7% gewijzigd door Verwijderd op 25-06-2005 13:56 ]


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Verwijderd schreef op zaterdag 25 juni 2005 @ 13:52:
code:
1
2
3
4
5
6
7
8
9
CREATE TABLE `Menu` (
`MenuID` int( 11 ) NOT NULL AUTO_INCREMENT ,
`ParentMenu` int( 11 ) default NULL REFERENCES `Menu` (`MenuID`) ON DELETE CASCADE ON UPDATE no ACTION ,
`Title` varchar( 20 ) NOT NULL default '',
`Active` smallint( 6 ) NOT NULL default '0',
`Lft` smallint( 6 ) default '0',
`Rgt` smallint( 6 ) default '0',
PRIMARY KEY ( `MenuID` ) 
) ENGINE = InnoDB ;


Dit ging als eerste al "fout", omdat de constraint niet werd aan gemaakt :S.
Voor zover ik weet had die gewoon moeten werken, hoewel het kan zijn dat die ON .. -clauses roet in het eten gooien.
Deze heb ik dus zelf nog een toegevoegd:
code:
1
2
ALTER TABLE `Menu`
  ADD CONSTRAINT `Menu_ibfk_1` FOREIGN KEY (`MenuID`) REFERENCES `Menu` (`MenuID`) ON DELETE CASCADE ON UPDATE NO ACTION;


Echter geeft me dit niet het gewenste resultaat. Ik kan geen menu items aanmaken met een "null" parent. Wat volgens mij met deze tabel opmaak moet mogen. Tenminste in sql-server moet het zo werken dacht ik...
Heb je exact die foreign key toegevoegd :? Want je verwijst daar de MenuID naar de MenuID... en dat is dus nogal dezelfde key en zegt sowieso niks over de ParentMenu. Echter als MySQL bovenstaande FK toestond, dan heb je kans dat ie probeert om een FK te checken op een record dat uiteraard nog niet kan bestaan vanwege de PK erop.
In de help van MySQL staat nog iets van "[MATCH FULL | MATCH PARTIAL | MATCH SIMPLE]". Ik weet niet of dit hier iets mee te maken heeft.
Ik geloof niet dat dat hier iets mee te maken had.
Weet iemand of dit mogelijk is, of wat ik verkeerd doe?
Ik wil een niet verplichte foreign key hebben. Dus de waarde moet NULL zijn, of voorkomen als primary key.
Jouw eerste aanpak zou moeten werken.

Verwijderd

Topicstarter
Sorry, inderdaad mijn eigen fout!

Met zelf de foreign key toevoegen op de juiste kolom ParentMenu, dan werkt het wel.

Maar op de een of andere manier pakt MySQL de foreign key niet vanuit het create script van de tabel.

Na lang zoeken weet ik nu ook eindelijk hoe ik foreign keys kan verwijderen:
code:
1
2
ALTER Table `Menu`
DROP FOREIGN KEY `Menu_ibfk_1`


De topic titel mag ook een klein fixje hebben, fForeign -> foreign