sql >> Databáze >  >> RDS >> Mysql

Tabulka nemůže mít primární klíč se 2 poli s auto_increment

Můj návrh je vytvořit obecný id sloupec s auto_increment jako první, aby měl v tabulce primární klíč. Poté vytvořte jedinečný klíč pro oba recipeId a stepNumber dohromady, takže nebudete mít žádnou duplicitní kombinaci těchto 2 polí.

Abyste mohli přidat více kroků pro jeden recept, musíte se ujistit, že žádný z recipeId , stepNumber nebo instruction je nastaveno na automatické zvýšení. Jediný sloupec nastavený na auto_increment zůstává id .

Schéma tabulky pro tyto 2 tabulky by tedy vypadalo takto (ignorujte category sloupec)

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;

Přidáme záznam do recipies nejprve stůl

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

Pak přidáme řádek

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 za SELECT a 1 v WHERE obě podmínky odkazují na řádek s id=1 v recipies stůl
  • IFNULL(MAX(stepNumber),0)+1 vybere nejvyšší číslo kroku pro daný recept (pokud neexistuje, vybere "0") +1

Zde je SQL housle pokud chcete vidět, jak to funguje.

[UPRAVIT]
Nikdy jsem nepotřeboval použít combo pro primární klíč, ale zřejmě následující práce na InnoDB za předpokladu, že ještě nemáte primární klíč v tabulce.

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


  1. Vyvolání procedury z orákula do krystalové zprávy

  2. Jak funguje GREATEST() v MariaDB

  3. SEC_CASE_SENSITIVE_LOGON Zastaráno v 12c

  4. Jaký je SQL ekvivalent k „transformaci“ pandy?