foreign key
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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 `pages` (
`id` int(11) NOT NULL auto_increment,
`title` varchar(50) NOT NULL,
`file` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
INSERT INTO `pages` (`id`, `title`, `file`) VALUES
(1, 'home', 'home.php'),
(2, 'contact', 'contact.php');
CREATE TABLE `subpages` (
`id` int(11) NOT NULL auto_increment,
`parent_id` int(11) NOT NULL,
`title` varchar(50) NOT NULL,
`file` varchar(50) NOT NULL,
PRIMARY KEY (`id`),
KEY `parent_id` (`parent_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
ALTER TABLE `subpages`
ADD CONSTRAINT `subpages_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `pages` (`id`) ON DELETE CASCADE;
`id` int(11) NOT NULL auto_increment,
`title` varchar(50) NOT NULL,
`file` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
INSERT INTO `pages` (`id`, `title`, `file`) VALUES
(1, 'home', 'home.php'),
(2, 'contact', 'contact.php');
CREATE TABLE `subpages` (
`id` int(11) NOT NULL auto_increment,
`parent_id` int(11) NOT NULL,
`title` varchar(50) NOT NULL,
`file` varchar(50) NOT NULL,
PRIMARY KEY (`id`),
KEY `parent_id` (`parent_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
ALTER TABLE `subpages`
ADD CONSTRAINT `subpages_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `pages` (`id`) ON DELETE CASCADE;
Als ik nu deze query wil uitvoeren:
Code (php)
1
2
3
4
2
3
4
INSERT INTO `subpages` ( `id` , `parent_id` , `title` , `file` )
VALUES (
NULL , '0', 'home_sub1', 'home_sub.php'
)
VALUES (
NULL , '0', 'home_sub1', 'home_sub.php'
)
Dan:
MySQL retourneerde: Documentatie
#1452 - Cannot add or update a child row: a foreign key constraint fails (`etiebaxnl/subpages`, CONSTRAINT `subpages_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `pages` (`id`) ON DELETE CASCADE)
Lijkt me dat ik echt domme fout maak, maar ik zie het echt niet.
Bvd, RT.
je gebruikt een 2e sleutel, parent_id, dit is niet nodig.
ALTER TABLE `subpages`
ADD CONSTRAINT `subpages_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `pages` (`id`) ON DELETE CASCADE;
moeten worden verandert in:
ALTER TABLE `subpages`
ADD FOREIGN KEY (`parent_id`) REFERENCES `pages` (`id`) ON DELETE CASCADE;
?
Dat werkt ook niet iig.
> Structuur
> Relatie overzicht (staat direct onder alle veldnamen, bij printopmaak)
Ik heb de tabel even verwijdert en opnieuw aangemaakt, zonder foreign key.
De structuur is nu:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
CREATE TABLE `subpages` (
`id` int(11) NOT NULL auto_increment,
`parent_id` int(11) NOT NULL,
`title` varchar(50) NOT NULL,
`file` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
`id` int(11) NOT NULL auto_increment,
`parent_id` int(11) NOT NULL,
`title` varchar(50) NOT NULL,
`file` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
Hoe ziet de query eruit om de juiste foreignkey te maken?
Ik dacht aan:
ALTER TABLE subpages ADD FOREIGN KEY (parent_id) REFERENCES pages(id) ON DELETE CASCADE;
Maar dat is blijkbaar niet goed? Want dan kan ik geen gegevens meer inserten in de tabel subpages.
Quote:
En waar is deze uitspraak op gebasseerd? Ik zie nergens een foutmelding staan bij de eveneens ontbrekende INSERT-query...Maar dat is blijkbaar niet goed? Want dan kan ik geen gegevens meer inserten in de tabel subpages.
Code (php)
1
2
3
4
2
3
4
INSERT INTO `subpages` ( `id` , `parent_id` , `title` , `file` )
VALUES (
NULL , '0', 'home_sub1', 'home_sub.php'
)
VALUES (
NULL , '0', 'home_sub1', 'home_sub.php'
)
MySQL retourneerde: Documentatie
#1452 - Cannot add or update a child row: a foreign key constraint fails (`etiebaxnl/subpages`, CONSTRAINT `subpages_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `pages` (`id`) ON DELETE CASCADE)
Je hebt het over de tabel 'subpages' waar er altijd sprake is van een parent_id (NOT NULL, zie jouw structuur). En welke waarde geef jij op? Precies, een 0... En die zal dus niet bestaan.
Oplossing: Geef een geldig parent_id op.
Kortom, niets bijzonders aan de hand.
Edit: Toch nog even, gooi de vervloekte backtics ` uit je query!!! Of moet ik soms gaan slaan??? @#$%^&*(
Hoeveel problemen wil je hebben...
Gewijzigd op 01/01/1970 01:00:00 door Frank -
Dit betekent dus wel dat een pagina met als id 0 geen subpagina's kan hebben?
Waarde 0 bestaat niet en dat is precies de reden waarom de query mislukt. Waarde 475934746 zal ook (nog) niet bestaan, de query zal daarop ook keurig mislukken. Er kan namelijk geen verband worden gelegd.
Dat is ook zo mooi aan fk's, die voeren controles uit op jouw input. Jij hoeft dus niet eerst te controleren of een waarde wel bestaat en daarna pas de data in te voeren, je kunt in 1x invoeren waarbij de database de controles uitvoert. Een fk is een constraint, een beperking. Dit is bijzonder waardevol en wordt door MySQL ernstig onderschat. Hopelijk gooien ze MyISAM en zijn debiele vriendjes nog eens weg, innoDB is (tot nu toe) de enig bruikbare engine. Het wachten is op Falcon, dat ziet er veelbelovend uit.
Edit: Zo maar een fraaie reactie over MySQL gegeven zonder direct over PostgreSQL te beginnen. Ik kán het wel!
Gewijzigd op 01/01/1970 01:00:00 door Frank -