Mit forslag er, opret det generiske id kolonne med auto_increment først, for at have en primær nøgle i tabellen. Opret derefter en unik nøgle til både recipeId og stepNumber sammen, så du ikke har nogen duplikatkombination af disse 2 felter.
For at kunne tilføje flere trin til en enkelt opskrift skal du sørge for, at ingen af recipeId , stepNumber eller instruction er indstillet til automatisk stigning. Den eneste kolonne indstillet til auto_increment forbliver id .
Så tabelskemaet for disse 2 tabeller ville se ud (ignorer category kolonne)
CREATE TABLE `recipies` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(30) NOT NULL DEFAULT '',
`category` enum('Salad','Dessert','Meat','Pastry') DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `instructions` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`recipeId` int(11) unsigned NOT NULL,
`stepNumber` int(11) NOT NULL DEFAULT '1',
`instruction` text NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `recipeId` (`recipeId`,`stepNumber`),
CONSTRAINT `instructions_ibfk_1` FOREIGN KEY (`recipeId`) REFERENCES `recipies` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Lad os tilføje en post i recipies bord først
INSERT INTO `recipies` (`name`,`category`)
VALUES ('Pumpkin Pie','Pastry');
Lad os derefter tilføje en række
INSERT INTO `instructions` (`recipeId`,`instruction`,`stepNumber`)
SELECT
1,
'You will need plenty of pumpkins!',
IFNULL(MAX(`stepNumber`),0)+1
FROM `instructions`
WHERE `recipeId`=1
- 1 efter
SELECTog 1 iWHEREbetingelse refererer begge til rækken medid=1irecipiestabel IFNULL(MAX(stepNumber),0)+1vil vælge det højeste trinnummer for den opskrift (hvis det ikke findes, vil det vælge "0") +1
Her er en SQL violin hvis du vil se det fungere.
[EDIT]
Jeg har aldrig haft brug for at bruge en kombination for den primære nøgle, men tilsyneladende følger værker på InnoDB, forudsat at du ikke allerede har en primær nøgle i tabellen.
ALTER TABLE `instructions`
ADD PRIMARY KEY(`recipeId`,`stepNumber`)