【问题标题】:Computed Column - as Primary key计算列 - 作为主键
【发布时间】:2016-05-05 23:48:18
【问题描述】:

我在创建表函数中有以下计算列:

Create table test
(
Code1 nchar(10),
Code2 nchar (10),
Type nchar(10),
Final AS CASE WHEN LEN(Code1)>0 THEN Code1 WHEN LEN(Code2)>0 THEN Code2 ELSE Type END
);

Alter table test
add constraint PK_Test1
Primary Key (Final)

但我收到以下错误

“无法在表中的可为空列上定义 PRIMARY KEY 约束”。

这是因为 Code 1、Code 2 和 Type 可以为 NULL,但三者永远不会为 NULL。其中之一将始终具有价值。

无论如何我可以将计算列定义为主键吗?

非常感谢 - JT

【问题讨论】:

  • 值“”(即单个空格)的语义与每个字段所需的 NULL 语义有何不同?如果不是,那么只需将它们全部设为 NOT NULL 并使用单个空格代替 NULL 值。这也将简化您在任何地方对该表的查找和连接逻辑。
  • 如果任一答案解决了您的问题,您可能需要将问题标记为已回答(答案左侧应该有一个复选标记)。如果他们都没有,请编辑您的问题以添加更多详细信息,以便可以(正确)回答。

标签: tsql primary-key sql-server-2014 calculated-columns create-table


【解决方案1】:

为什么不直接使用unique constraint,因为它允许为空

与 PRIMARY KEY 约束不同,UNIQUE 约束允许值 空值。但是,与参与 UNIQUE 约束的任何值一样, 每列只允许一个空值。 UNIQUE 约束可以是 由 FOREIGN KEY 约束引用。

【讨论】:

    【解决方案2】:

    您的计算列需要被持久化并且 NOT NULL 才能用作主键;

    Create table test
    (
        Code1 nchar(10),
        Code2 nchar (10),
        Type nchar(10),
        Final AS CASE WHEN LEN(Code1)>0 THEN Code1 
                      WHEN LEN(Code2)>0 THEN Code2 
                      ELSE Type END 
              PERSISTED NOT NULL
    );
    

    An SQLfiddle to test with.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-19
      相关资源
      最近更新 更多