天天看點

sqlserver 如何把一列分為一行顯示_SQL server問題總結01

sqlserver 如何把一列分為一行顯示_SQL server問題總結01

SQL server版本: S QL server 2019

1.主鍵

sqlserver 如何把一列分為一行顯示_SQL server問題總結01

什麼是主鍵:

看一下官方文檔的解釋

表通常具有包含唯一辨別表中每一行的值的一列或一組列。 這樣的一列或多列稱為表的主鍵 (PK),用于強制表的實體完整性。 由于主鍵限制可保證資料的唯一性,是以經常對辨別列定義這種限制。

如果為表指定了主鍵限制, 資料庫引擎 将通過為主鍵列自動建立唯一索引來強制資料的唯一性。 當在查詢中使用主鍵時,此索引還允許對資料進行快速通路。 如果對多列定義了主鍵限制,則一列中的值可能會重複,但來自主鍵限制定義中所有列的值的任何組合必須唯一。

如下圖所示, Purchasing.ProductVendor 表中的 ProductID 和 VendorID 列構成了針對此表的複合主鍵限制。 這確定了 ProductVendor 表中的每個行都具有 ProductID 和 VendorID 的一個唯一組合************。 這樣可以防止插入重複的行。

sqlserver 如何把一列分為一行顯示_SQL server問題總結01
  • 一個表隻能包含一個主鍵限制。
  • 主鍵不能超過 16 列且總密鑰長度不能超過 900 個位元組。
  • 由主鍵限制生成的索引不會使表中的索引數超過 999 個非聚集索引和 1 個聚集索引。
  • 如果沒有為主鍵限制指定聚集或非聚集索引,并且表中沒有聚集索引,則使用聚集索引。
  • 在主鍵限制中定義的所有列都必須定義為不為 Null。 如果沒有指定為 Null 性,則參與主鍵限制的所有列的為 Null 性都将設定為不為 Null。
  • 如果在 CLR 使用者定義類型的列中定義主鍵,則該類型的實作必須支援二進制排序。

大概意思就是設定為主鍵的一列每個資料都是唯一的,當需要表示唯一位址或ID時會用到

摘抄一段CSDN 使用者harbor1981的一段解釋:

關系型資料庫中的一條記錄中有若幹個屬性,若其中某一個屬性組(注意是組)能唯一辨別一條記錄,該屬性組就可以成為一個主鍵 

比如  

學生表(學号,姓名,性别,班級) 

其中每個學生的學号是唯一的,學号就是一個主鍵 

課程表(課程編号,課程名,學分) 

其中課程編号是唯一的,課程編号就是一個主鍵 

成績表(學号,課程号,成績) 

成績表中單一一個屬性無法唯一辨別一條記錄,學号和課程号的組合才可以唯一辨別一條記錄,是以 學号和課程号的屬性組是一個主鍵 成績表中的學号不是成績表的主鍵,但它和學生表中的學号相對應,并且學生表中的學号是學生表的主鍵,則稱成績表中的學号是學生表的外鍵 

同理 成績表中的課程号是課程表的外鍵

外鍵(FK)是用于建立和加強兩個表資料之間的連結的一列或多列。通過将儲存表中主鍵值的一列或多列添加到另一個表中,可建立兩個表之間的連結。這個列就成為第二個表的外鍵

2.辨別列:

辨別規範:

sqlserver 如何把一列分為一行顯示_SQL server問題總結01
sqlserver 如何把一列分為一行顯示_SQL server問題總結01

當一個列在辨別規範下的(是辨別)屬性設為“是”,那這一列就成了辨別列

先看一下官方文檔對辨別規範下的選項的定義:

辨別訓示列是否為表的辨別列。 可能的值包括 True 和 False。

辨別種子訓示辨別列的初始行值。

辨別增量“辨別增量”屬性指定在 Microsoft SQL Server 為插入的行生成辨別值時,在現有的最大行辨別值基礎上所加的值****。

辨別列和主鍵作用相似,當表的資料插入時會自動生成一條對應的辨別列内的資料,也就是這波資料的一個ID号,可以用這個辨別列的資料來表示這波資料,舉個例子:班裡來了位新同學,他的資訊都在檔案裡,那麼他的年齡,性别,身高,戶籍等資訊錄入檔案後給他配置設定個學号,這個學号就是在辨別列内的資料,年齡性别等資料就是表裡的其他列存儲的資料,每個同學的資訊在這個表内都有唯一的一個學号(辨別列内的一個号碼)對應,一個表隻能有一個辨別列,就像身份證号碼,隻有這具有唯一性的一串數字表示你是你

辨別增量和辨別種子比較好解釋,辨別列的資料具有自增性,種子就是你ID号起始的地方,增量是下一個ID号加多少,例如上圖我設定的辨別增量55,種子10001,那麼往這個表插入一組資料後他的辨別号(ID)為10056,再插一組就是10111,依次類推

3.辨別規範的是辨別選項無法修改的解決辦法:

當(是辨別)變灰無法将“否”改為“是”時,請檢查目前列的資料類型是否為int,“預設值或綁定”選項後是否有設定預設值

當這一列做辨別時需:資料類型為int,預設值為空才可以

4.執行查詢時報錯:

在SQL Server Management Studio中建立查詢

select SCOPE_IDENTITY() from tb_User

執行時報錯

錯誤提示:提示對象名 'tb_User' 無效

改為前面加上資料庫名,格式為:資料庫名.dbo.tb_User

例  select SCOPE_IDENTITY() from db_ZDHYXXZ.dbo.tb_User

問題解決

sqlserver 如何把一列分為一行顯示_SQL server問題總結01