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

时间:2013-01-19 21:10:13

标签: mysql sql

我正在尝试创建一个代表配方中指令的表:

+---------------------+
| 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 

我正在努力纠正/可能吗?

3 个答案:

答案 0 :(得分:3)

我的建议是,首先使用auto_increment创建通用id列,以在表中创建主键。然后一起为recipeIdstepNumber创建唯一键,这样您就不会有这两个字段的任何重复组合。

为了能够为单个食谱添加多个步骤,您需要确保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
  • 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