Моето предложение е да създадете общия id
колона с auto_increment първо, за да има първичен ключ в таблицата. След това създайте уникален ключ и за двата recipeId
и stepNumber
заедно, така че няма да имате дублиращи се комбинации от тези 2 полета.
За да можете да добавите няколко стъпки за една рецепта, ще трябва да се уверите, че нито една от recipeId
, stepNumber
или instruction
е настроен на автоматично нарастване. Единствената колона, зададена на auto_increment, остава id
.
Така че схемата на таблицата за тези 2 таблици ще изглежда така (игнорирайте category
колона)
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;
Нека добавим запис в recipies
таблица първа
INSERT INTO `recipies` (`name`,`category`)
VALUES ('Pumpkin Pie','Pastry');
Тогава нека добавим ред
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 след
SELECT
и 1 вWHERE
и двете условия се отнасят за реда сid=1
вrecipies
маса IFNULL(MAX(stepNumber),0)+1
ще избере най-високия номер на стъпка за тази рецепта (ако не съществува, ще избере "0") +1
Ето SQL цигулка ако искате да видите как работи.
[РЕДАКТИРАНЕ]
Никога не ми се е налагало да използвам комбинация за първичния ключ, но очевидно следването работи на InnoDB, при условие че вече нямате първичен ключ в таблицата.
ALTER TABLE `instructions`
ADD PRIMARY KEY(`recipeId`,`stepNumber`)