MySQL:自动递增组合键

时间:2010-03-10 09:44:05

标签: mysql primary-key auto-increment composite-key

好的,我有一个看起来像这样的表:

Post
 ˪ Id
 ˪ Version
 ˪ Title
 ˪ Content

这个想法是Id和Version一起成为主键,因为你可以多次发布一个帖子,但版本不同。

我的问题是:我希望自动增加ID。在这样的设置中这可能吗?例如,当我插入帖子的第二个版本时,事情会搞砸吗?


好像我需要在这里澄清一些事情。我想要的是做这样的事情:

INSERT INTO posts VALUES (NULL, 0, "A title", "Some content");

这将创建一个带有一些自动增加id的新帖子。让我们说它得到了ID 7.我现在想要创建一个新版本:

INSERT INTO posts VALUES (7, 1, "A new title", "Some adjusted content");

那会有用吗?或者id仍会获得自动递增的值?即使它确实有效,我是否应该从数据库设计的角度做一些我不应该做的事情,等等?

4 个答案:

答案 0 :(得分:1)

我会这样做:

Post:  
- ID (your primary key with auto_increment)
- post_id (this is which post you mean)
- version
- title
- content

新ID仅指定此数据集的唯一ID。 post_id然后指定该数据集所属的帖子,该版本代表条目的修订。

答案 1 :(得分:1)

考虑以下示例数据:

id  version  title  content   
1     1        t1     c1
2     1        t2     c2

现在,用户更改帖子的标题和内容,创建一个具有自动递增ID的新行:

3     2        t3     t3

这是一些帖子的第二版,但你看不出它是post one的新版本(id为1的条目)还是post 2(id为2的条目)。

你需要一些东西来识别帖子。您可以在Tobias在他的回答中建议您向表中添加post_id列。

此外,可以完全删除自动递增的id并使用复合主键(post_id,version) - 要点是拥有一个不会自动递增的post_id,以便您可以拥有如下数据:

post_id  version  title  content   
1           1        t1     c1
2           1        t2     c2 
1           2        t3     t3

在这里,很明显第三行代表了帖子1的新版本。

答案 2 :(得分:0)

为什么不使用Id作为某种版本指标,否则你会有两列服务于同一目的,这被认为是数据库设计中的一个缺陷。

答案 3 :(得分:0)

您将使用复合主键,其中id和version一起标识该条目。然后你可以auto_increment id。添加新条目时,它将自动递增。当您修改帖子时,您明确定义了id和修订版,并且id不会增加。