Ma suggestion est de créer le générique id
colonne avec auto_increment en premier, pour avoir une clé primaire dans la table. Créez ensuite une clé unique pour les deux recipeId
et stepNumber
ensemble afin d'éviter toute combinaison en double de ces 2 champs.
Pour pouvoir ajouter plusieurs étapes pour une seule recette, vous devrez vous assurer qu'aucun de recipeId
, stepNumber
ou instruction
est réglé sur l'auto-incrémentation. La seule colonne définie sur auto_increment reste id
.
Ainsi, le schéma de table pour ces 2 tables ressemblerait à (ignorez la category
colonne)
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;
Ajoutons un enregistrement dans les recipies
tableau d'abord
INSERT INTO `recipies` (`name`,`category`)
VALUES ('Pumpkin Pie','Pastry');
Ajoutons ensuite une ligne
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 après
SELECT
et 1 dansWHERE
les deux conditions font référence à la ligne avecid=1
dans lesrecipies
tableau IFNULL(MAX(stepNumber),0)+1
sélectionnera le numéro d'étape le plus élevé pour cette recette (s'il n'existe pas, il sélectionnera "0") +1
Voici un violon SQL si vous voulez le voir fonctionner.
[MODIFIER]
Je n'ai jamais eu besoin d'utiliser une combinaison pour la clé primaire, mais apparemment, la suite fonctionne sur InnoDB à condition que vous n'ayez pas déjà une clé primaire dans la table.
ALTER TABLE `instructions`
ADD PRIMARY KEY(`recipeId`,`stepNumber`)