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
SELECT
og 1 iWHERE
betingelse refererer begge til rækken medid=1
irecipies
tabel IFNULL(MAX(stepNumber),0)+1
vil 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`)