【问题标题】:How to create a surrogate key column in existing table?如何在现有表中创建代理键列?
【发布时间】:2017-02-13 01:48:20
【问题描述】:

我想使用 SSMS 在现有表中创建一个名为 PurchaseOrderID 的新列。它结合了LineNumberPONUMBER 来创建一个代理键,然后我会进入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


【解决方案1】:

肯定是这样的。运行更新后,只需将您将在 PK 中使用的列更改为 NOT NULL。由于现在列将具有值,因此可以将其设置为 NOT NULL,然后它将允许分配 PK。还要确保桌面上还没有另一个 PK。只能有 1 个!

  1. 更新记录
  2. 将列更改为不为空
  3. 在字段上创建 PK

【讨论】:

  • This message在我分配了一个PK并尝试保存后弹出。
  • @JonathanPorter 尝试通过 SQL 进行操作。 ALTER TABLE ALTER COLUMN ColumnName VARCHAR(XX) NOT NULL 而不是使用 GUI。
  • 只是对@Matt A. 的回复的一个修正 - 要删除该警告,请转到 Tools > Options > Designers >Table and Database Designers 并取消选中 防止保存需要重新创建表的更改 复选框.可能需要重启 SSMS 才能生效。
  • 感谢@Matt A。我实际上从未在选项的措辞上考虑过太多,也没有意识到这是一个错误;我只是假设它在后台调用 T-SQL。奇怪的是,这个 bug 持续了这么久。
  • 除了@Matt A.'s answer之外,我还收到错误消息:“不允许保存更改。您所做的更改需要删除下表并重新已创建。”我解决此问题的方法是使用:ALTER TABLE FactPurchaseOrders ADD PRIMARY KEY (PurchaseOrderID),而不是尝试通过 GUI 添加 PK。谢谢大家的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-31
  • 1970-01-01
  • 1970-01-01
  • 2021-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多