我的建议是,首先使用 auto_increment 创建通用id
列,以便在表中有一个主键。recipeId
然后为两者和一起创建一个唯一键,stepNumber
这样您就不会有这两个字段的任何重复组合。
为了能够为单个配方添加多个步骤,您需要确保没有recipeId
,stepNumber
或者instruction
设置为自动增量。唯一设置为 auto_increment 的列仍然存在id
。
所以这两个表的表模式看起来像(忽略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 after
SELECT
和 1WHERE
都指表id=1
中的行recipies
IFNULL(MAX(stepNumber),0)+1
将为该配方选择最高的步骤编号(如果它不存在,它将选择“0”)+1
如果你想看到它工作,这里有一个SQL fiddle 。
[编辑]
我从来不需要对主键使用组合,但显然在 InnoDB 上进行了以下工作,前提是您在表中还没有主键。
ALTER TABLE `instructions`
ADD PRIMARY KEY(`recipeId`,`stepNumber`)