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
SELECT
en 1 in deWHERE
voorwaarde verwijzen beide naar de rij metid=1
in derecipies
tafel IFNULL(MAX(stepNumber),0)+1
selecteert 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`)