[英]Table can't have 2-field primary key with auto_increment
我正在尝试创建一个代表配方中的指令的表:
+---------------------+
| 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
我正在尝试做的正确/可能吗?
我的建议是,首先使用auto_increment创建通用id
列,以在表中具有主键。 然后一起为recipeId
和stepNumber
创建一个唯一键,这样您就不会在这2个字段中有任何重复的组合。
为了能够为单个配方添加多个步骤,您需要确保没有将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
之后的1和WHERE
条件中的1都引用recipies
表中id=1
的行 IFNULL(MAX(stepNumber),0)+1
将为该配方选择最高的步骤号(如果不存在,则将选择“ 0”)+1 如果您想查看它的运行,这是一个SQL提琴 。
[编辑]
我从不需要为主键使用组合键,但是如果您在表中没有主键,显然可以在InnoDB上进行以下工作。
ALTER TABLE `instructions`
ADD PRIMARY KEY(`recipeId`,`stepNumber`)
我必须问-您为什么要这么做? 如果您考虑一下,那么您的配方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。
-结束编辑-
亲切的问候,韦斯提。
我认为如果您使用的是InnoDB,则无法做到这一点。 显然,您可以使用MyISAM。
http://dev.mysql.com/doc/refman/5.6/en/example-auto-increment.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.