Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Tabelle darf keinen 2-Felder-Primärschlüssel mit auto_increment haben

Mein Vorschlag ist, erstellen Sie die generische id Spalte mit auto_increment zuerst, um einen Primärschlüssel in der Tabelle zu haben. Erstellen Sie dann einen eindeutigen Schlüssel für beide recipeId und stepNumber zusammen, sodass Sie keine doppelte Kombination dieser beiden Felder haben.

Um mehrere Schritte für ein einzelnes Rezept hinzufügen zu können, müssen Sie sicherstellen, dass keine recipeId vorhanden ist , stepNumber oder instruction auf Autoinkrement eingestellt ist. Die einzige auf auto_increment gesetzte Spalte bleibt id .

Das Tabellenschema für diese 2 Tabellen würde also so aussehen (ignorieren Sie die category Spalte)

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;

Lassen Sie uns einen Eintrag in den recipies hinzufügen Tabelle zuerst

INSERT INTO `recipies` (`name`,`category`)
VALUES ('Pumpkin Pie','Pastry');

Dann fügen wir eine Zeile hinzu

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 nach SELECT und 1 im WHERE Bedingung beziehen sich beide auf die Zeile mit id=1 in den recipies Tabelle
  • IFNULL(MAX(stepNumber),0)+1 wird die höchste Schrittnummer für dieses Rezept auswählen (wenn sie nicht existiert, wird "0" ausgewählt) +1

Hier ist eine SQL-Fiddle wenn Sie sehen möchten, dass es funktioniert.

[BEARBEITEN]
Ich habe noch nie eine Kombination für den Primärschlüssel benötigt, aber anscheinend folgende Arbeiten an InnoDB, vorausgesetzt, Sie haben nicht bereits einen Primärschlüssel in der Tabelle.

ALTER TABLE `instructions`
ADD PRIMARY KEY(`recipeId`,`stepNumber`)