【发布时间】:2017-02-13 01:48:20
【问题描述】:
我想使用 SSMS 在现有表中创建一个名为 PurchaseOrderID 的新列。它结合了LineNumber 和PONUMBER 来创建一个代理键,然后我会进入table design 模式并在那里为其分配一个PK。
创建新列:
ALTER TABLE FactPurchaseOrders
ADD PurchaseOrderID VARCHAR(64);
填充值:
UPDATE FactPurchaseOrders
SET PurchaseOrderID = (CONVERT(VARCHAR(64), LineNumber) + CONVERT(VARCHAR(64), PONUMBER))
WHERE 1=1;
目前,我无法为此列分配 PK,我相信因为它可以为空。 我也尝试过先在设计模式下创建它,然后出现同样的问题。
【问题讨论】:
-
希望我没有遗漏什么,但是在您更新了列值之后,您是否在表设计器中选中
Allow Nulls复选框并在添加 PK 约束之前保存定义? -
另外作为验证点,您可以运行
SELECT PurchaseOrderID, COUNT(*) FROM FactPurchaseOrders GROUP BY PurchaseOrderID HAVING COUNT(*) > 1以确保没有重复行,这也会阻止创建 PK 约束。 -
您为什么要创建该列?创建有效的计算列是一个非常糟糕的主意。只需在两列上进行 PK。如果由于某种原因(例如仅支持单列 PK 的非常有缺陷的前端)这是不可能的,则将其设为计算列。事实上,您正试图违反基本的数据库设计原则,因此您正走向痛苦的世界。
标签: sql sql-server sql-server-2008 tsql ssms