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
SELECToch 1 iWHEREvillkor hänvisar båda till raden medid=1irecipiestabell IFNULL(MAX(stepNumber),0)+1kommer 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`)