sql >> Databasteknik >  >> RDS >> Mysql

Tabell kan inte ha 2-fälts primärnyckel med auto_increment

Mitt förslag är att skapa det generiska id kolumn med auto_increment först, för att ha en primärnyckel i tabellen. Skapa sedan en unik nyckel för båda recipeId och stepNumber tillsammans så att du inte har någon dubblettkombination av dessa två fält.

För att kunna lägga till flera steg för ett enda recept måste du se till att inget av recipeId , stepNumber eller instruction är inställd på automatisk ökning. Den enda kolumn som är inställd på auto_increment förblir id .

Så tabellschemat för dessa två tabeller skulle se ut (ignorera category kolumn)

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;

Låt oss lägga till en post i recipies bord först

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

Låt oss sedan lägga till en rad

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 efter SELECT och 1 i WHERE villkor hänvisar båda till raden med id=1 i recipies tabell
  • IFNULL(MAX(stepNumber),0)+1 kommer att välja det högsta stegnumret för det receptet (om det inte finns kommer det att välja "0") +1

Här är en SQL-fiol om du vill se det fungera.

[REDIGERA]
Jag har aldrig behövt använda en kombination för primärnyckeln men uppenbarligen fungerar följande på InnoDB förutsatt att du inte redan har en primärnyckel i tabellen.

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


  1. Hur konverterar man DateTime till ett nummer i MySQL?

  2. Ta bort dubbletter i stora MySql-tabeller

  3. mysql hämtar alla rader samtidigt som sammanfattningar används

  4. Hur man delar en sträng i SQL Server