繁体   English   中英

表不能包含具有auto_increment的2字段主键

[英]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列,以在表中具有主键。 然后一起为recipeIdstepNumber创建一个唯一键,这样您就不会在这2个字段中有任何重复的组合。

为了能够为单个配方添加多个步骤,您需要确保没有将recipeIdstepNumberinstruction设置为自动递增。 设置为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM