Sql-Server

SQL Server - 唯一約束語法

  • March 4, 2021

以下兩種方式建構的表在功能上有區別嗎?

CREATE TABLE [dbo].[test_uq](
   [ID] [int] NOT NULL,
   [f1] [int] NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[test_uq] ADD UNIQUE NONCLUSTERED(f1)

對比

CREATE TABLE [dbo].[test_uq](
   [ID] [int] NOT NULL,
   [f1] [int] NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[test_uq] ADD CONSTRAINT UQ_f1 UNIQUE (f1);

我相信他們都在實現一個唯一約束,並在

$$ f1 $$列,但考慮到不同的語法(無論是在創建過程中,還是在之後從 SSMS 編寫建構腳本),我想知道一個是否不同(或更好?)不知何故。感謝您的任何回饋。

已測試 - 見下圖(將第二個範例中的表重命名為test_uq_2

創建唯一約束

確實沒有太大區別,但是 - 在我看來,第二個範例更好,因為它使您能夠命名約束/索引,而在第一個範例中 SQL Server 會自動命名它

我更喜歡將其創建為 1) 顯式命名和 2) 忽略 NULL 或使用其他過濾條件的能力的索引:

CREATE TABLE [dbo].[test_uq](
   [ID] [int] NOT NULL,
   [f1] [int] NULL
) ON [PRIMARY]
GO

CREATE UNIQUE NONCLUSTERED INDEX uq_test ON test_uq(f1) WHERE f1 IS NOT NULL;

引用自:https://dba.stackexchange.com/questions/286381