2012-12-02 88 views
0

我是數據庫的新手。我有一個SQL數據庫,它看起來有點像這樣:刪除數據庫中的項目,但保持唯一ID

BEGIN; 
CREATE TABLE "country" (
    "id" integer NOT NULL PRIMARY KEY, 
    "name" varchar(255) NOT NULL 
) 
; 
CREATE TABLE "location" (
    "id" integer NOT NULL PRIMARY KEY, 
    "name" varchar(255) NOT NULL, 
    "coordinate" varchar(255) NOT NULL, 
    "country_id" integer NOT NULL REFERENCES "country" ("id") 
) 
; 
CREATE TABLE "item" (
    "id" integer NOT NULL PRIMARY KEY, 
    "title" varchar(25) NOT NULL, 
    "description" text NOT NULL, 
    "date" datetime NOT NULL, 
    "source" varchar(255) NOT NULL, 
    "link" varchar(255) NOT NULL, 
    "location_id" integer NOT NULL REFERENCES "location" ("id") 
) 
; 

如果我從數據庫中刪除項目項,然後添加新項目條目到數據庫中,會發生什麼情況有關的項目主鍵?我的意思是,它會增加,還是會填補任何空白?

在我的情況下,我無法將不需要的條目保存在數據庫中作爲「active = no」條目,我需要將它們完全刪除,但是我擔心它會混淆項目上的主鍵。

+0

什麼阻止你嘗試它並找出答案? – Laurence

+0

「但我擔心它搞亂了項目上的主鍵」---任何技術原因呢? – zerkms

+0

我想我應該,但我不知道如何設置SQL環境。儘管我總是喜歡理解這個理論。 – Jimmy

回答

1

實際上相對較少的應用要求一個無間隙序列。大多數需要無間隙序列的應用程序與會計有關。如果發票是連續編號的,審計人員想要將它們全部考慮在內,並且您不能用粗糙的順序來做到這一點。 (如果發票號30445不能生成,是因爲它錯位,因爲它從來不存在,或者是因爲有人正在輸入欺詐性發票?)

在SQL數據庫中,不僅僅是MySQL而不僅僅是PostgreSQL,序列自動增量,連續,bigserials)dbms產生不保證是無縫的。事實上,他們保證在充分理解和普遍條件下創造差距。

這些種類的整數通常是在交易過程中產生的。如果事務回滾,則該整數將被丟棄。沒有嘗試再次使用它。下一個成功的插入到同一個表中將會產生差距。

從這樣的表中刪除行不會混淆主鍵。它只留下一個缺口。數量和差距都是相對無意義的。

+0

「(如果發票號碼30445不能生成,是因爲它錯位,因爲它從來不存在,或者因爲有人正在輸入欺詐性發票?)」---它與PK有關嗎?爲什麼不具有人工序列PK和唯一發票編號 – zerkms

+0

我在這裏詳細寫了這裏:http://stackoverflow.com/questions/9984196/rails-postgres-does-not-re-use-deleted-ids-but-mysql -does –

+0

@zerkms:唯一的發票ID號碼不保證發票ID號碼的無間隔序列。需要指出的是,如果您的(相對較少的)應用程序需要無間隙序列,則dbms序列生成器是生成它的錯誤工具。另一方面,如果你只需要自動增加身份證號碼,預計會出現差距,並且不要對他們失眠。他們毫無意義。 –