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 iWHERE
villkor hänvisar båda till raden medid=1
irecipies
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`)