是否可以使用允许重复的AUTO_INCREMENT列?

时间:2009-05-28 17:52:29

标签: mysql sql auto-increment mysql-error-1075

我有一个包含AUTO_INCREMENT字段的表格。目前,它也是一个主要的关键。

但是,在某些情况下,我需要此AUTO_INCREMENT列才能允许重复。换句话说 - 两个不同的行在AUTO_INCREMENT列中可以具有相同的值。这意味着拥有一个不是PRIMARY KEY的AUTO_INCREMENT字段。

这可能吗?

我猜它不是,因为每当我尝试这样做时,我都会收到此错误:

ERROR 1075 (42000) at line 130: Incorrect table definition; there can be only one auto column and it must be defined as a key

我喜欢拥有AUTO_INCREMENT字段,因为它使我不必手动存储/增加数据库中其他位置的单独计数器。我可以插入表中并获取插入的值。但是,如果我不能重复,似乎我将不得不使用一个单独的表来跟踪并手动增加该字段。

更新:作为一个快速说明,我已经熟悉将AUTO_INCREMENT字段与另一个密钥as described here分组。让我们假设为了论证,由于数据库中的其他约束,此解决方案将无法工作。

2 个答案:

答案 0 :(得分:5)

MySQL中的自动增量字段必须是(即索引)的一部分,但不一定是主键或唯一键的一部分。

CREATE TABLE mytable (
  id   INT PRIMARY KEY,
  otto INT AUTO_INCREMENT,
  KEY (otto)
);

-- allow the auto-increment to generate a value

INSERT INTO mytable (id, otto) VALUES (123, DEFAULT);

SELECT * FROM mytable;

> 123, 1

-- specify a duplicate value, overriding the auto-increment mechanism

INSERT INTO mytable (id, otto) VALUES (456, 1); 

SELECT * FROM mytable;

> 123, 1
> 456, 1

-- allow the auto-increment to generate another value

INSERT INTO mytable (id, otto) VALUES (789, DEFAULT);

SELECT * FROM mytable;

> 123, 1
> 456, 1
> 789, 2

答案 1 :(得分:2)

听起来像'子任务'是'任务'有一个FK引用的表。也就是说,如果重用子任务。

OTOH如果任务可以有多个子任务,并且子任务可以链接到多个任务,那么你在一个单独的表中查看多对多。

在任何一种情况下,我认为你不希望数据库自动生成这些'linked-IDs'。