【问题标题】:MSSQL: Add Unique Constraint at Create Table and allow NULLs [duplicate]MSSQL:在创建表中添加唯一约束并允许 NULL [重复]
【发布时间】:2019-08-23 07:59:13
【问题描述】:

抱歉,可能是菜鸟问题,但我找不到答案。

CREATE TABLE SomeTable
(
   Id DECIMAL NOT NULL,
   UserIdentifier NVARCHAR(100) NULL,
   PRIMARY KEY (Id),
   ????
)

如何在允许 Null 的 UserIdentifier 列上的 CREATE TABLE 中添加唯一键约束?

我知道在 CREATE TABLE 之外你可以说... WHERE UserIdentifier IS NOT NULL, but inside?​​p>

谢谢!

【问题讨论】:

  • 啊,我现在才看到您要求过滤唯一索引的内联语法,将索引嵌入到 CREATE TABLE 中。这很简单:没有。不幸的是,T-SQL 在这种方式上并不完全一致。这通常无关紧要,除非您出于某种原因绝对肯定必须有一个声明。另请注意,唯一的约束(不是索引)不允许过滤;这仅适用于唯一索引。
  • 也许this 可以帮助你。您可以创建允许多条记录为空的唯一索引

标签: sql-server


【解决方案1】:

这很简单。如果您想在单列上添加,则只需添加 UNIQUE 关键字即可在列级别应用。
但如果您希望这是基于多列的,则需要添加CONSTRAINT。有关更多信息,您可以找到此链接。link

CREATE TABLE Persons (
    ID int NOT NULL,
    LastName varchar(255) NOT NULL UNIQUE,   --- FOR ADDING ON ONE COLUMN
    FirstName varchar(255),
    Age int,
    CONSTRAINT UC_Person UNIQUE (ID,LastName)   --- FOR MULTIPLE COLUMNS
);


【讨论】:

    【解决方案2】:

    假设您想要多行的值为NULL,您将无法使用UNIQUE CONSTRAINT,因为NULL 仍然是一个值(即使是未知值)。例如:

    CREATE TABLE dbo.YourTable (UserIdentifier nvarchar(100) NULL,
                                CONSTRAINT UC_UI UNIQUE (UserIdentifier));
    GO
    INSERT INTO dbo.YourTable (UserIdentifier)
    VALUES(NULL);
    GO
    INSERT INTO dbo.YourTable (UserIdentifier)
    VALUES(NULL);
    GO
    DROP TABLE dbo.YourTable;
    

    注意第二个INSERT 失败。

    但是,您可以改为使用有条件的UNIQUE INDEX

    CREATE TABLE dbo.YourTable (UserIdentifier nvarchar(100) NULL);
    
    CREATE UNIQUE NONCLUSTERED INDEX UI_UI ON dbo.YourTable(UserIdentifier) WHERE UserIdentifier IS NOT NULL;
    
    GO
    INSERT INTO dbo.YourTable (UserIdentifier)
    VALUES(NULL); -- Success
    GO
    INSERT INTO dbo.YourTable (UserIdentifier)
    VALUES(NULL); --Success
    GO
    INSERT INTO dbo.YourTable (UserIdentifier)
    VALUES(N'Steve'); --Success
    GO
    INSERT INTO dbo.YourTable (UserIdentifier)
    VALUES(N'Jayne'); --Success
    GO
    INSERT INTO dbo.YourTable (UserIdentifier)
    VALUES(N'Steve'); --Fails
    GO
    DROP TABLE dbo.YourTable;
    

    正如 Jeroen Mostert 在 cmets 中所说,您不能在创建表的过程中创建唯一索引;它必须在单独的语句中创建。没有语法可以创建 UNIQUE INDEX 作为 CREATE TABLE 语句的一部分。

    【讨论】:

    • 好的。谢谢你,先生。
    【解决方案3】:

    在 SQL Server 中使用 UNIQUE 关键字。

    CREATE TABLE SomeTable
    (
       Id DECIMAL NOT NULL,
       UserIdentifier NVARCHAR(100) NULL UNIQUE,
       PRIMARY KEY (Id)
    )
    

    当尝试在列中再次插入相同的值时,它会抛出错误。

    请在db<>fiddle的演示中找到相同的执行方式

    【讨论】:

    • 那不会允许NULLs。好吧,它会允许一个NULL,之后它会抛出一个违反约束的错误。
    猜你喜欢
    • 2021-05-09
    • 1970-01-01
    • 2014-04-05
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 2023-01-23
    • 2015-03-27
    • 1970-01-01
    相关资源
    最近更新 更多