2016-10-04 23 views
3

我想在使用SSMS的現有表格中創建一個名爲PurchaseOrderID的新列。它結合了LineNumberPONUMBER來創建代理鍵,然後我會進入表設計模式並在那裏爲其分配一個PK。如何在現有表中創建代理鍵列?

創建新列:

ALTER TABLE FactPurchaseOrders 
ADD PurchaseOrderID VARCHAR(64); 

與值填充:

UPDATE FactPurchaseOrders 
SET PurchaseOrderID = (CONVERT(VARCHAR(64), LineNumber) + CONVERT(VARCHAR(64), PONUMBER)) 
WHERE 1=1; 
這個我無法分配此列中的PK

目前,我相信,因爲它可爲空。 我也曾嘗試在設計模式下首先創建它,併發生同樣的問題。

Error when trying to save PK

+0

但願我不是失去了一些東西PK,但你更新的列值後,你檢查的'允許表設計器中的「空」複選框並在添加PK約束之前保存定義? – bassrek

+0

同樣作爲驗證的一點,您可以運行'SELECT PurchaseOrderID,COUNT(*)FROM FactPurchaseOrders GROUP BY PurchaseOrderID HAVING COUNT(*)> 1'來確保沒有重複的行也會阻止創建PK約束。 – bassrek

+0

爲什麼你要創建該列?創建一個有效的計算列是一個非常糟糕的主意。只需將PK放在兩列上即可。如果由於某種原因無法實現(比如僅支持單列PK的非常不足的前端),則將其作爲計算列。事實上,你試圖違反基本的數據庫設計原則,結果你正在走向一個痛苦的世界。 –

回答

2

這是肯定的情況下。在運行更新之後,只需將您在PK中使用的列更改爲NOT NULL即可。由於列現在具有值,所以它可以設置爲NOT NULL,然後它將允許PK的分配。還要確保桌子上已經沒有其他的PK了。只能有1個!

  1. 更新記錄
  2. 阿爾特列不爲空
  3. 創建的字段
+0

[此消息](https://gyazo.com/c0800e1b79dd15208bf822ecc84fbd6f)在我分配PK並嘗試保存後彈出。 –

+0

@JonathanPorter fyi:一般來說,外部圖像的鏈接是不被接受的。如果圖像消失,則SO值減小。如果圖像包含文本,則可能希望人們手動輸入文本,例如,數據庫問題的樣本數據。對於錯誤消息,只需在帖子或評論中引用該消息就更有意義。 – HABO

+1

@JonathanPorter嘗試通過SQL來完成。 ALTER TABLE ALTER COLUMN ColumnName VARCHAR(XX)NOT NULL,而不是使用GUI。 –

相關問題