簡體   English   中英

SQL主鍵生成

[英]SQL Primary Key Generation

使用的SQL Server = MySQL
編程語言=不相關,但我堅持使用Java和C#

我有一個理論上的問題,關於為SQL數據庫生成主鍵的最佳方法,然后再由我編寫的另一個程序使用它(假設它不是基於Web的。)

我知道主鍵必須是唯一的,並且我更喜歡主鍵,當我使用數據庫時以及在關系表中時,無論是在Eclipse還是Windows控制台中,我都可以在看到主鍵時立即知道它們的來源。 。 因此,除非可以提供特定的唯一值(例如ISBN或SS num),否則我通常將自己的主鍵創建為字母數字字符串。 對於Table Actors,主鍵可能看起來像a1,並且在Movies m1020表中(假定標題不是唯一的,例如電影“ Return to witch Mountain”的不同版本)。

所以我的問題是,如何最好地生成主鍵(在程序中還是在程序本身中的db中)? 對於這樣的方案,是否最好使用兩列,其中一列具有常量字符串(例如“ a”)用於參與者,並且具有單個運行計數? (在那種情況下,我需要研究如何引用一個PK跨越多列的表)處理這種任務的最專業方法是什么?

感謝您的時間。

最佳實踐是讓您的數據庫引擎生成主鍵作為auto-increment NUMBER。 即使對於您來說似乎太“抽象”,字母數字字符串也不是一個好方法。 然后,您不必擔心程序中的主鍵(Java,C#或其他任何東西); 在數據庫中插入的每一行,都會自動插入一個唯一的主鍵

順便說一句,對於您的解決方案,我不確定您是否可以管理同時插入兩行的情況...您確定絕對不會在任何情況下都可以復制主鍵嗎?

您的第一行說:-

SQL Server = MySQL

這不是真的。 他們是不同的。

如何最好地生成主鍵(在我的程序中或在數據庫本身中作為一個過程)?

當您指定帶有主鍵約束的列時,MYSQL將生成主鍵。 主鍵是自動生成的,並且會自動遞增。

如果您希望主鍵為字母數字(我個人不建議這樣做),則可以這樣嘗試:-

CREATE TABLE A(
id INT NOT NULL AUTO_INCREMENT,
prefix CHAR(30) NOT NULL,
PRIMARY KEY (id, prefix),

我建議您將主鍵設置為Integer,因為這將使您的選擇更容易和更優化。對於MyIsam表,您可以創建多列索引並將auto_increment字段放在輔助列上

對於MySQL,有一種最佳方法-為主鍵表字段設置AUTO_INCREMENT屬性。 您可以稍后使用last_insert_id函數獲取生成的ID,或者它是Java或C#模擬。

我不知道為什么要使用“字母數字”值-為什么不只是一個普通數字?

無論如何,無論使用哪種數據庫系統,都可以使用任何可用的自動增量功能,並堅持使用。 不要創建數據庫之外的主鍵-你可以不知道什么時候/如何兩個系統可能會在同一時間,這可能會造成問題,如果兩個創建相同的PK值,並嘗試將其插入訪問數據庫。

另外,在我看來,PK應該只是特定行的ID(在單列中),僅此而已-如果您需要一個字段來指示記錄涉及例如“ actor”類型的數據,則應該是一個單獨的字段,並且與主鍵無關(為什么?)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM