2009-02-24 132 views

回答

10

DBMS獨立?這是一個問題。兩種最常用的方法是自動遞增列和序列,而大多數DBMS只執行一個或另一個,但不能同時執行這兩個操作。所以獨立於數據庫的方式是讓另一個表中包含一列的值,並鎖定,選擇,更新和解鎖。

通常我會說「地獄與DBMS獨立性」,並與PostgreSQL中的序列或MySQL中的自動增量列一起使用。就我的目的而言,支持這兩種方法比試圖找出一種無處不在的方式要好。

0

使用自動遞增的id列。

+0

我認爲,通過「獨立於數據庫管理系統」,他意味着自動增量列是不可能的。生成這種列的語法對於所有常用數據庫來說都不相同。 – 2009-02-24 17:52:13

+0

這是DMBS依賴。 – 2009-02-24 17:52:34

+0

許多流行的DBMS沒有任何類型的自動增量列類型。 – 2009-02-24 17:52:44

1

有自動遞增或序列

什麼是這一點,那就是你最擔心的?

你將如何處理SQL本身? MySQL有限制,

SQL Server有頂,

甲骨文排名

然後有100萬其他像觸發器,如果​​alter table語法等等等等

5

如果你可以創建一個Globally Unique Identifier (GUID)在你選擇的編程語言 - 認爲這是你的ID。

在排除故障時(輸入INT爲where的條件要容易得多),但它們還有一些優點。通過在本地分配GUID作爲您的密鑰,您可以輕鬆構建父 - 子記錄關係,而不必先將父級保存到數據庫並檢索該ID。而且由於GUID根據定義是唯一的,所以您不必擔心在服務器上增加密鑰。

0

真的有一個理由,他們必須按順序?如果您只是將它用作ID,那麼您應該只能使用UUID的一部分或md5(now())的前幾位數字。

0

你可以花時間和按摩它。它會成爲像

DateTime.Now.Ticks 

相當於所以是這樣的YYYYMMDDHHMMSSSS

1

是的,在原始SQL的明顯的方式(在我的優先順序排列)是:a)序列B)自動增量字段。更好,更現代,更獨立於DBMS的方法是根本不觸及SQL,而是使用(良好)ORM。

1

沒有通用的方法來做到這一點。如果有的話,每個人都會使用它。按照定義,SQL定義會憎惡這個想法 - 它是基於集合邏輯的反模式(儘管在很多實際案例中是一個有用的邏輯)。

您試圖從別處插入標識值的最大問題是,SQL語句涉及多個記錄,並且必須同時生成多個值。

如果您需要它,請將它作爲數據庫選擇要求的一部分,以便與您的應用程序一起使用。任何嚴重的DBMS產品都將提供自己的機制來使用,並且很容易就可以對DML中的差異進行編碼。這些變體幾乎都在DDL中。

1

我總是會爲數據庫特定的解決方案,但如果你真的這樣做的通常方式是實現你自己的序列。您的RDBMS必須支持事務。

您創建一個包含int列的順序表,並與第一號種子這一點,您的交易邏輯,然後看起來像這樣

 
begin transaction 
update tblSeq set intID = intID + 1 
select @myID = intID from tblSeq 

inset into tblData (intID, ...) values (@myID, ...) 
end transaction 

事務強制寫入鎖定使得然後下一個排隊插入在記錄插入到tblData之前,不能更新tblSeq值。只要所有插入都通過此事務,那麼您生成的ID就是按順序排列的。

0

它可能有點側面的方法,但一個好的ORM類型的庫可能至少可以隱藏這些差異。例如,在Ruby中,有ActiveRecord(通常用於但不完全綁定到Ruby the Rails Web框架),它具有Migrations。在平臺不可知的代碼中聲明的表定義中,實現細節(如數據類型,順序標識生成和索引創建)被推到視角之下。

我已經透明地在SQLite上開發了一個模式,然後在MS SQL Server上實現它,並在稍後移植到Oracle。永遠不要改變生成我的模式定義的代碼。

正如我所說,它可能不是你正在尋找的東西,但封裝各種不同的最簡單方法是使用一個已經爲你完成封裝的庫。

0

由於只有SQL,下面可能是一個對的方法:

  1. 創建一個表包含起始編號爲您的需求
  2. 當應用程序部署在第一時間,應用程序應該讀在其上下文中的價值。
  3. 之後根據需要 3.1寫ID到數據庫(以線程安全的方式)增量ID(以線程安全的方式),它始終保持更新值 3.2不要將其寫入數據庫,不斷遞增在內存(線程安全的方式)
  4. 如果由於某種原因服務器正在下降,值電流id寫入數據庫
  5. 當服務器再次它將從離開的地方挑,最後一次。
相關問題