Mein Vorschlag ist, erstellen Sie die generische id
Spalte mit auto_increment zuerst, um einen Primärschlüssel in der Tabelle zu haben. Erstellen Sie dann einen eindeutigen Schlüssel für beide recipeId
und stepNumber
zusammen, sodass Sie keine doppelte Kombination dieser beiden Felder haben.
Um mehrere Schritte für ein einzelnes Rezept hinzufügen zu können, müssen Sie sicherstellen, dass keine recipeId
vorhanden ist , stepNumber
oder instruction
auf Autoinkrement eingestellt ist. Die einzige auf auto_increment gesetzte Spalte bleibt id
.
Das Tabellenschema für diese 2 Tabellen würde also so aussehen (ignorieren Sie die category
Spalte)
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;
Lassen Sie uns einen Eintrag in den recipies
hinzufügen Tabelle zuerst
INSERT INTO `recipies` (`name`,`category`)
VALUES ('Pumpkin Pie','Pastry');
Dann fügen wir eine Zeile hinzu
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 nach
SELECT
und 1 imWHERE
Bedingung beziehen sich beide auf die Zeile mitid=1
in denrecipies
Tabelle IFNULL(MAX(stepNumber),0)+1
wird die höchste Schrittnummer für dieses Rezept auswählen (wenn sie nicht existiert, wird "0" ausgewählt) +1
Hier ist eine SQL-Fiddle wenn Sie sehen möchten, dass es funktioniert.
[BEARBEITEN]
Ich habe noch nie eine Kombination für den Primärschlüssel benötigt, aber anscheinend folgende Arbeiten an InnoDB, vorausgesetzt, Sie haben nicht bereits einen Primärschlüssel in der Tabelle.
ALTER TABLE `instructions`
ADD PRIMARY KEY(`recipeId`,`stepNumber`)