2010-03-10 69 views
1

好吧,我有一個表,這將是這個樣子:MySQL的:自動遞增組合鍵

Post 
˪ Id 
˪ Version 
˪ Title 
˪ Content 

的想法是,Id和版本一起將主鍵,因爲你可以有一個職位多次但不同版本。

我的問題是這樣的:我想有自動增量的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仍然會得到一個自動遞增的值?即使它確實起作用,我是否正在從數據庫設計的角度來做我不該從事的工作?

回答

1

考慮下面的示例數據:

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

現在用戶更改標題和帖子的內容,創建一個新行自動增加ID:

3  2  t3  t3 

這是兩個版本一些帖子,但你不能看到它是一個新的版本(ID爲1的條目)或後兩個(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

+0

沒錯,但是如果我在插入新行時給它一個特定的id,post_id仍會自動增加? – Svish 2010-03-10 14:33:26

+0

如果您在插入語句中顯式提及auto_increment列,那麼mysql會使用您的值並且不會增加它。 – titanoboa 2010-03-10 18:11:22

+0

聽起來不錯:-) – Svish 2010-03-10 19:26:26

0

爲什麼不使用Id作爲某種版本指示器,否則你會有兩列服務於同一目的,這在DB設計中被認爲是一個缺陷。

+0

因爲我只想要一個具有特定ID的帖子,但它可以有不同的版本。我希望不同的帖子能夠擁有相同的版本號。 – Svish 2010-03-10 11:22:29

1

我會做這樣的:

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

新的ID唯一指定該數據集的唯一ID。然後,post_id指定該數據集屬於哪個帖子,版本代表條目的修訂版本。

+0

嗯,但後來我得到另一列,這並不意味着什麼。 – Svish 2010-03-10 11:23:10

+0

正確.. 但是,自動增加post_id或版本都沒有意義..否則,你必須自己關心這些值。 – Tobias 2010-03-10 11:54:05

+1

只要我可以通過給予它來「覆蓋」它,auto_increment of post_id將是有意義的一個現有的ID而不是NULL。 – Svish 2010-03-10 14:31:55

0

你會使用複合主鍵其中id和版本一起標識項的新版本。然後你可以auto_increment id。當你添加一個新條目時,它會自動增加。當你修改一篇文章時,你明確地定義了id和修訂版,id不會增加。