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
SELECTet 1 dansWHEREles deux conditions font référence à la ligne avecid=1dans lesrecipiestableau IFNULL(MAX(stepNumber),0)+1sé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`)