sql >> Database teknologi >  >> RDS >> Mysql

Tabellen kan ikke have 2-felts primær nøgle med auto_increment

Mit forslag er, opret det generiske id kolonne med auto_increment først, for at have en primær nøgle i tabellen. Opret derefter en unik nøgle til både recipeId og stepNumber sammen, så du ikke har nogen duplikatkombination af disse 2 felter.

For at kunne tilføje flere trin til en enkelt opskrift skal du sørge for, at ingen af ​​recipeId , stepNumber eller instruction er indstillet til automatisk stigning. Den eneste kolonne indstillet til auto_increment forbliver id .

Så tabelskemaet for disse 2 tabeller ville se ud (ignorer category kolonne)

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;

Lad os tilføje en post i recipies bord først

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

Lad os derefter tilføje en række

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 og 1 i WHERE betingelse refererer begge til rækken med id=1 i recipies tabel
  • IFNULL(MAX(stepNumber),0)+1 vil vælge det højeste trinnummer for den opskrift (hvis det ikke findes, vil det vælge "0") +1

Her er en SQL violin hvis du vil se det fungere.

[EDIT]
Jeg har aldrig haft brug for at bruge en kombination for den primære nøgle, men tilsyneladende følger værker på InnoDB, forudsat at du ikke allerede har en primær nøgle i tabellen.

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


  1. MySQL bruger oprettet midlertidig tabel er fuld

  2. mysql count total fra et felt med kommaseparerede værdier

  3. PHP-session er i konflikt med AJAX

  4. Hvordan kan jeg opdatere tabel, hvis der findes en tabel med MySQL info?