sql >> Database >  >> RDS >> Mysql

Tabel kan geen primaire sleutel met 2 velden hebben met auto_increment

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 de WHERE voorwaarde verwijzen beide naar de rij met id=1 in de recipies 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`)


  1. hoe PostgreSQL-verbinding uit de IBM WSJdbc41Connection te halen

  2. asp.net / EntityFramework - Waarom crasht mijn toepassingsgroep?

  3. Kolom voor automatische verhoging toevoegen aan bestaande tabel, gesorteerd op datum

  4. MySql met de juiste syntaxis voor de over-clausule