什麼是最好的,與DBMS無關的方式來生成一個ID號,將立即在INSERT語句中使用,保持ID的大致順序?什麼是爲SQL插入生成ID的最佳方法?
回答
DBMS獨立?這是一個問題。兩種最常用的方法是自動遞增列和序列,而大多數DBMS只執行一個或另一個,但不能同時執行這兩個操作。所以獨立於數據庫的方式是讓另一個表中包含一列的值,並鎖定,選擇,更新和解鎖。
通常我會說「地獄與DBMS獨立性」,並與PostgreSQL中的序列或MySQL中的自動增量列一起使用。就我的目的而言,支持這兩種方法比試圖找出一種無處不在的方式要好。
使用自動遞增的id列。
有自動遞增或序列
什麼是這一點,那就是你最擔心的?
你將如何處理SQL本身? MySQL有限制,
SQL Server有頂,
甲骨文排名
然後有100萬其他像觸發器,如果alter table語法等等等等
如果你可以創建一個Globally Unique Identifier (GUID)在你選擇的編程語言 - 認爲這是你的ID。
在排除故障時(輸入INT爲where
的條件要容易得多),但它們還有一些優點。通過在本地分配GUID作爲您的密鑰,您可以輕鬆構建父 - 子記錄關係,而不必先將父級保存到數據庫並檢索該ID。而且由於GUID根據定義是唯一的,所以您不必擔心在服務器上增加密鑰。
真的有一個理由,他們必須按順序?如果您只是將它用作ID,那麼您應該只能使用UUID的一部分或md5(now())的前幾位數字。
你可以花時間和按摩它。它會成爲像
DateTime.Now.Ticks
相當於所以是這樣的YYYYMMDDHHMMSSSS
是的,在原始SQL的明顯的方式(在我的優先順序排列)是:a)序列B)自動增量字段。更好,更現代,更獨立於DBMS的方法是根本不觸及SQL,而是使用(良好)ORM。
沒有通用的方法來做到這一點。如果有的話,每個人都會使用它。按照定義,SQL定義會憎惡這個想法 - 它是基於集合邏輯的反模式(儘管在很多實際案例中是一個有用的邏輯)。
您試圖從別處插入標識值的最大問題是,SQL語句涉及多個記錄,並且必須同時生成多個值。
如果您需要它,請將它作爲數據庫選擇要求的一部分,以便與您的應用程序一起使用。任何嚴重的DBMS產品都將提供自己的機制來使用,並且很容易就可以對DML中的差異進行編碼。這些變體幾乎都在DDL中。
我總是會爲數據庫特定的解決方案,但如果你真的有這樣做的通常方式是實現你自己的序列。您的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就是按順序排列的。
它可能有點側面的方法,但一個好的ORM類型的庫可能至少可以隱藏這些差異。例如,在Ruby中,有ActiveRecord(通常用於但不完全綁定到Ruby the Rails Web框架),它具有Migrations。在平臺不可知的代碼中聲明的表定義中,實現細節(如數據類型,順序標識生成和索引創建)被推到視角之下。
我已經透明地在SQLite上開發了一個模式,然後在MS SQL Server上實現它,並在稍後移植到Oracle。永遠不要改變生成我的模式定義的代碼。
正如我所說,它可能不是你正在尋找的東西,但封裝各種不同的最簡單方法是使用一個已經爲你完成封裝的庫。
由於只有SQL,下面可能是一個對的方法:
- 創建一個表包含起始編號爲您的需求
- 當應用程序部署在第一時間,應用程序應該讀在其上下文中的價值。
- 之後根據需要 3.1寫ID到數據庫(以線程安全的方式)增量ID(以線程安全的方式),它始終保持更新值 3.2不要將其寫入數據庫,不斷遞增在內存(線程安全的方式)
- 如果由於某種原因服務器正在下降,值電流id寫入數據庫
- 當服務器再次它將從離開的地方挑,最後一次。
- 1. 生成bit.ly或twitpic風格id的最佳方法是什麼?
- 2. 什麼是生成唯一會話ID的最佳方式?
- 3. 創建自動生成ID的最佳做法是什麼
- 4. 什麼是生成ID以使行成爲個體的最佳方式?
- 5. 什麼是爲SQL Server表自動生成INSERT語句的最佳方法?
- 6. 將用戶輸入放入生成的javascript的最佳方法是什麼?
- 7. 在SQL中生成datetime的最方便的方法是什麼?
- 8. 驗證記錄是否成功插入的最佳方法是什麼?
- 9. 什麼是自動生成主鍵的最佳方法?
- 10. 從XML生成高質量PDF的最佳方法是什麼?
- 11. 從dotnet類生成xsd xml-scheme的最佳方法是什麼?
- 12. 在rethinkdb中插入python datetime的最佳方法是什麼?
- 13. 設置光標/插入位置的最佳方法是什麼?
- 14. 在VB.NET中嵌入SQL的最佳方法是什麼
- 15. 防止SQL注入mysql的最佳方法是什麼
- 16. 在sql server 2012上插入15.000記錄的最佳方法是什麼?
- 17. 在批量插入後更新服務器生成的實體ID的最佳做法是什麼?
- 18. MySQL併發插入,爲什麼會發生,以及處理它的最佳方法是什麼?
- 19. 爲每個播放列表生成HTML標記的最佳方法是什麼?
- 20. 在java中爲neo4j節點生成juuid的最佳方法是什麼
- 21. 爲散列生成唯一分數的最佳方法是什麼
- 22. 爲分類問題生成假數據的最佳方法是什麼?
- 23. 什麼是SQL插入一堆行的最快方法
- 24. 鍵入()的最佳方式是什麼?
- 25. 使用EF在oracle中獲取插入ID的最佳方式是什麼?
- 26. 生成(漂亮的)路線圖的最佳方式是什麼?
- 27. 縮小ASP.NET生成的Javascript的最佳方式是什麼?
- 28. 在SQL Server中執行批量插入忽略並返回id的最佳方法是什麼?
- 29. 在C#中生成KML文件的最佳方式是什麼?
- 30. 什麼是動態生成where子句的最佳方式?
我認爲,通過「獨立於數據庫管理系統」,他意味着自動增量列是不可能的。生成這種列的語法對於所有常用數據庫來說都不相同。 – 2009-02-24 17:52:13
這是DMBS依賴。 – 2009-02-24 17:52:34
許多流行的DBMS沒有任何類型的自動增量列類型。 – 2009-02-24 17:52:44