iT邦幫忙

0

SQL資料庫問題

石頭 2017-03-08 14:17:2810944 瀏覽

各位大大好!
小弟有一個問題
就是資料庫中的資料表會有主鍵
但是主鍵是否一定要是"識別規格"
因為我在https://msdn.microsoft.com/zh-tw/library/bb399731(v=vs.100).aspx
建立的資料庫中發現裡面有主鍵但是卻沒有"識別規格"
而我們之前的前輩是說 資料表要有"識別規格"的主鍵比較好
想請問一張表中是否一定"識別規格"的主鍵

souda iT邦好手 1 級 ‧ 2017-03-08 14:37:38 檢舉
你應該要先了解何謂主鍵(PK)https://msdn.microsoft.com/zh-tw/library/ms189039.aspx 有了這初步認知再來修改你的問題,才知道你需要大家協助你甚麼.
石頭 iT邦高手 1 級 ‧ 2017-03-08 22:12:01 檢舉
謝謝分享!!
我再去看看
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

1
做工仔人!
iT邦大師 1 級 ‧ 2017-03-08 14:49:40
最佳解答

是否要有"識別規格"來當唯一識主鍵的需求是:見人見智的事.
但是一個TABLE 中最好是有可以用來識別資料的唯一主鍵.
用來識別的唯一主鍵也可以是複合欄位.
以鼎新的ERP系統為例.
鼎新ERP系統的TABLE中完全沒有用到"識別規格"來當唯一主鍵.
如單據的單頭:以單別+單別為唯一鍵值. 單身部份再加項次做為唯一鍵值.
TABLE中用唯一鍵值的功能主要有二個:
1.建立索引,以加快搜尋資料的速度.
2.避免資料重複.如果沒有唯一鍵值的欄位存在,當資料不小心重複時,就只能用DELETE的語法將相同的資料一次全部刪除.

石頭 iT邦高手 1 級 ‧ 2017-03-08 22:11:29 檢舉

了解 謝謝大大解說^^

2
bizpro
iT邦大師 1 級 ‧ 2017-03-09 10:47:39

而我們之前的前輩是說 資料表要有"識別規格"的主鍵比較好

前輩的建議是對的. identity翻作識別規格實有誤導之嫌, 實際上是自動序號的作用, 為什麼您的前輩要建議用identity做主鍵, 先從主鍵說起, 通常建立主鍵有三種常用方式:
1.資料庫的自動序號: 也就是MSSQL的identity, 或MySQL的auto_increment,...等
2.Universal Unique IDentification, UUID: 寰宇唯一碼, 通用唯一識別碼,..
3.商業邏輯編碼: 如商品分類, 單別,,,加上序號來編碼.
這三種方式中, 自動序號(identity, auto_increment)是最簡易的, UUID是最穩定的, 這兩者保證儲存資料不會因為主鍵重複而中斷, 然而商業邏輯可能會有變化, 商業邏輯可能錯誤, 導致需改變商業邏輯編碼方式. 您的問題是關於自動序號(identity), 為什麼要用自動序號當主鍵值? 主因有:

  1. 資料庫掛保證, 儲存資料不會因為主鍵重複而中斷.
  2. 簡單, 索引容易.
  3. 最重要的, 在多主(multiple masters)資料庫同步的情境下, 自動序號可以透過參數控制不同的主機產生資料庫掛保證的不重複自動序號. 以identity(seed,increment)為例:
    主機A: seed=1,increment=3: 1,4,7,10,13,...
    主機B: seed=2,increment=3: 2,5,8,11,14,...
    主機C: seed=3,increment=3: 3,6,9,12,15,...
    同步後的序號為:
    1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,....
    原則是seed大於0且不能大於increment. 當同步主機數增加超過increment, 需要改變資料結構的increment, 但對MySQL而言, 只需修改系統參數.

鼎新ERP系統的TABLE中完全沒有用到"識別規格"來當唯一主鍵.

我想您看過鼎新的資料結構...

石頭 iT邦高手 1 級 ‧ 2017-03-09 19:58:57 檢舉

謝謝您~~
解說的好透徹

我要發表回答

立即登入回答