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 vWHERE
obě podmínky odkazují na řádek sid=1
vrecipies
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`)