Mysql
 sql >> Base de données >  >> RDS >> Mysql

La table ne peut pas avoir de clé primaire à 2 champs avec auto_increment

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 dans WHERE les deux conditions font référence à la ligne avec id=1 dans les recipies 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`)