【问题标题】:SQL Server 2012 Create unique index with constraint on table creationSQL Server 2012 创建具有表创建约束的唯一索引
【发布时间】:2018-07-27 12:55:51
【问题描述】:

我在 Visual Studio 中使用数据库项目,我希望在创建表时使用 where 子句创建唯一索引,而不必创建表并添加另一个脚本以将约束添加到索引。我的约束是

CREATE UNIQUE NONCLUSTERED INDEX ix_IdNotNull
ON MyTable(MyId)
WHERE MyId IS NOT NULL;

我正在寻找类似的东西

create table MyTable
(
    MyId int unique where MyId is not null
)

但 SSMS 不喜欢这样。是否可以在创建表时将 where 子句分配给唯一约束?

【问题讨论】:

  • 在 SQL Server 2012 中,没有。在以后的版本中,是的。 SQL Server 2017 至少接受CREATE TABLE MyTable(MyId INT NULL, INDEX ix_IdNotNull UNIQUE(MyId) WHERE MyId IS NOT NULL)。对于 2012 年,我认为单独使用 CREATE INDEX 是不可避免的(请注意,它一个索引,而不是一个约束——UNIQUE 约束不能被过滤)。
  • @JeroenMostert 我担心是这样。感谢您的快速回复。
  • 没有什么损失——在空表上创建索引是即时的,如果你有理由可以CREATEs 包装在一个事务中担心表在没有索引的情况下存在的非常小的时间。
  • 如果我没有在 VS 中使用数据库项目,那么我根本不会担心它,我想只要在底部添加几行来创建它表所在的脚本,这没什么大不了的。但是在 IME 和数据库项目中,当您在其中执行不常见的操作时,它们就会开始变得不稳定。

标签: sql-server tsql


【解决方案1】:

添加 NC UNIQUE 索引

对于 sql 2016 +

create table MyTable
(
    MyId int ,

    INDEX [i_MyTable] UNIQUE NONCLUSTERED (MyId) WHERE [MyId] IS NOT NULL
)

早期版本

CREATE UNIQUE NONCLUSTERED INDEX [i_MyTable]
ON [MyTable] (MyId)
WHERE [MyId] IS NOT NULL

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    • 2017-11-19
    • 2019-12-21
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    • 2012-07-30
    相关资源
    最近更新 更多