Mijn suggestie is, maak de generieke id kolom met auto_increment eerst, om een primaire sleutel in de tabel te hebben. Maak vervolgens een unieke sleutel voor beide recipeId en stepNumber samen, zodat u geen dubbele combinatie van deze 2 velden heeft.
Om meerdere stappen voor een enkel recept toe te voegen, moet u ervoor zorgen dat geen van recipeId , stepNumber of instruction is ingesteld op automatisch verhogen. De enige kolom die is ingesteld op auto_increment blijft id .
Dus het tabelschema voor deze 2 tabellen zou er als volgt uitzien (negeer de category kolom)
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;
Laten we een record toevoegen aan de recipies tafel eerst
INSERT INTO `recipies` (`name`,`category`)
VALUES ('Pumpkin Pie','Pastry');
Laten we dan een rij toevoegen
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 na
SELECTen 1 in deWHEREvoorwaarde verwijzen beide naar de rij metid=1in derecipiestafel IFNULL(MAX(stepNumber),0)+1selecteert het hoogste stapnummer voor dat recept (als het niet bestaat, selecteert het "0") +1
Hier is een SQL-viool als je wilt dat het werkt.
[EDIT]
Ik heb nooit een combo voor de primaire sleutel nodig gehad, maar blijkbaar werkt het volgende op InnoDB, op voorwaarde dat je nog geen primaire sleutel in de tabel hebt.
ALTER TABLE `instructions`
ADD PRIMARY KEY(`recipeId`,`stepNumber`)