我正在尝试创建一个代表配方中指令的表:
+---------------------+
| recipeId (PK, FK) |
| stepNumber (PK) |
|---------------------|
| instruction |
+---------------------+
我们的想法是拥有(recipeId, stepNumber)
的主键,其中recipeId
来自recipe
表和stepNumber
自动增量。
当我尝试创建此表时,出现以下错误:
#1075 - Incorrect table definition; there can be only one auto column and it must be defined as a key
我正在努力纠正/可能吗?
答案 0 :(得分:3)
我的建议是,首先使用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
SELECT
之后和WHERE
条件中的1都引用id=1
表格中recipies
的行IFNULL(MAX(stepNumber),0)+1
将选择该食谱的最高步骤编号(如果它不存在则会选择“0”)+1 如果你想看到它正常工作,这是一个SQL fiddle。
<强> [编辑] 强>
我从来不需要使用组合键作为主键,但显然是在InnoDB上工作,前提是你没有表中的主键。
ALTER TABLE `instructions`
ADD PRIMARY KEY(`recipeId`,`stepNumber`)
答案 1 :(得分:2)
我不得不问 - 你为什么要这样做?如果您考虑一下,您的配方ID(FK)将是唯一的,那么您的步数始终从1开始(如果您基于零,则为零)。
- 编辑 -
steps table:
recipe_id step_id step_detail
--------- ------- ---------------------------
1 1 blah
1 2 blah
1 3 blah
2 1 blah
2 2 blah
2 3 blah
2 4 blah
2 5 blah
--------- ------- ---------------------------
如果您在此处包含自动增量,则步骤编号将继续上升,而不是重置为1以用于下一个配方。
- 结束编辑 -
亲切的问候, 西部高地白梗。
答案 2 :(得分:1)
我不认为你可以用InnoDB这样做,如果这就是你正在使用的。显然你可以使用MyISAM。
http://dev.mysql.com/doc/refman/5.6/en/example-auto-increment.html