Når du gjør:
DELETE FROM `jobs` WHERE `job_id` =1 LIMIT 1
Det er feil:
#1451 - Cannot delete or update a parent row: a foreign key constraint fails
(paymesomething.advertisers, CONSTRAINT advertisers_ibfk_1 FOREIGN KEY
(advertiser_id) REFERENCES jobs (advertiser_id))
Her er tabellene mine:
CREATE TABLE IF NOT EXISTS `advertisers` (
`advertiser_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`password` char(32) NOT NULL,
`email` varchar(128) NOT NULL,
`address` varchar(255) NOT NULL,
`phone` varchar(255) NOT NULL,
`fax` varchar(255) NOT NULL,
`session_token` char(30) NOT NULL,
PRIMARY KEY (`advertiser_id`),
UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
INSERT INTO `advertisers` (`advertiser_id`, `name`, `password`, `email`, `address`, `phone`, `fax`, `session_token`) VALUES
(1, 'TEST COMPANY', '', '', '', '', '', '');
CREATE TABLE IF NOT EXISTS `jobs` (
`job_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`advertiser_id` int(11) unsigned NOT NULL,
`name` varchar(255) NOT NULL,
`shortdesc` varchar(255) NOT NULL,
`longdesc` text NOT NULL,
`address` varchar(255) NOT NULL,
`time_added` int(11) NOT NULL,
`active` tinyint(1) NOT NULL,
`moderated` tinyint(1) NOT NULL,
PRIMARY KEY (`job_id`),
KEY `advertiser_id` (`advertiser_id`,`active`,`moderated`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
INSERT INTO `jobs` (`job_id`, `advertiser_id`, `name`, `shortdesc`, `longdesc`, `address`, `active`, `moderated`) VALUES
(1, 1, 'TEST', 'TESTTEST', 'TESTTESTES', '', 0, 0);
ALTER TABLE `advertisers`
ADD CONSTRAINT `advertisers_ibfk_1` FOREIGN KEY (`advertiser_id`) REFERENCES `jobs` (`advertiser_id`);
Som det er nå, må du slette raden i annonsørtabellen før du kan slette raden i jobbtabellen som den refererer til. Dette:
ALTER TABLE `advertisers`
ADD CONSTRAINT `advertisers_ibfk_1` FOREIGN KEY (`advertiser_id`)
REFERENCES `jobs` (`advertiser_id`);
...er faktisk det motsatte av hva det burde være. Som det er, betyr det at du må ha en post i jobbtabellen før annonsørene. Så du må bruke:
ALTER TABLE `jobs`
ADD CONSTRAINT `advertisers_ibfk_1` FOREIGN KEY (`advertiser_id`)
REFERENCES `advertisers` (`advertiser_id`);
Når du har korrigert fremmednøkkelforholdet, vil sletteanvisningen din fungere.
I henhold til ditt nåværende (muligens mangelfulle) design må du slette raden i annonsørtabellen før du kan slette raden i jobbtabellen som den refererer til.
Alternativt kan du sette opp fremmednøkkelen slik at en sletting i den overordnede tabellen fører til at rader i underordnede tabeller slettes automatisk. Dette kalles en kaskadesletting. Det ser omtrent slik ut:
ALTER TABLE `advertisers`
ADD CONSTRAINT `advertisers_ibfk_1`
FOREIGN KEY (`advertiser_id`) REFERENCES `jobs` (`advertiser_id`)
ON DELETE CASCADE;
Når det er sagt, som andre allerede har påpekt, føles fremmednøkkelen din som om den skal gå omvendt siden annonsørtabellen virkelig inneholder primærnøkkelen og jobbtabellen inneholder fremmednøkkelen. Jeg ville omskrive det slik:
ALTER TABLE `jobs`
ADD FOREIGN KEY (`advertiser_id`) REFERENCES `advertisers` (`advertiser_id`);
Og kaskadesletting vil ikke være nødvendig.
Hvis det er mer enn én jobb som har samme annonsør_id, skal fremmednøkkelen din være det:
ALTER TABLE `jobs`
ADD CONSTRAINT `advertisers_ibfk_1`
FOREIGN KEY (`advertiser_id`)
REFERENCES `advertisers` (`advertiser_id`);
Ellers (hvis det er omvendt i ditt tilfelle), hvis du vil at radene i annonsør skal slettes automatisk hvis raden i jobb slettes, legg til alternativet 'ON DELETE CASCADE' på slutten av fremmednøkkelen:
ALTER TABLE `advertisers`
ADD CONSTRAINT `advertisers_ibfk_1`
FOREIGN KEY (`advertiser_id`)
REFERENCES `jobs` (`advertiser_id`)
ON DELETE CASCADE;
Sjekk ut Begrensninger for fremmednøkler