簡體   English   中英

帶有附加列值檢查的SQL外鍵約束

[英]SQL foreign key constraint with additional column value check

我有這種情況

CREATE TABLE [dbo].[Customer]
(
    Id INT IDENTITY(1,1) NOT NULL,
    IsWholesaler BIT NOT NULL,
    Name NVARCHAR(255) NOT NULL
)

CREATE TABLE [dbo].[WholesalerUser]
(
    Id INT IDENTITY(1,1) NOT NULL,
    CustomerId INT NOT NULL,
    UserId INT NOT NULL
)

CREATE TABLE [dbo].[User]
(
        Id INT IDENTITY(1,1) NOT NULL,
        Name NVARCHAR(255)
)

將IsWholesaler列設置為true的一個客戶可以擁有多個用戶。 我有WholesalerUser表用於此目的,但外鍵WholesalerUser.CustomerId連接到Customer.Id但如何檢查列IsWholesaler = 1

可以一次在多個列上定義外鍵。

  • 將一個列IsWholesaler添加到WholesalerUser
  • 添加檢查約束以確保它始終為1
  • 在兩列(CustomerId, IsWholesaler)定義外鍵。
  • 要定義此類外鍵, Customer表應具有主鍵(ID, IsWholesaler)或單獨的唯一索引(ID, IsWholesaler)

Customer

CREATE TABLE [dbo].[Customer](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [IsWholesaler] [bit] NOT NULL,
    [Name] [nvarchar](255) NOT NULL,
CONSTRAINT [PK_Customer] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
))

支持外鍵約束的唯一索引:

CREATE UNIQUE NONCLUSTERED INDEX [IX_ID_IsWholesaler] ON [dbo].[Customer] 
(
    [Id] ASC,
    [IsWholesaler] ASC
)

WholesalerUser

CREATE TABLE [dbo].[WholesalerUser](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [CustomerId] [int] NOT NULL,
    [IsWholesaler] [bit] NOT NULL,
    [UserId] [int] NOT NULL,
CONSTRAINT [PK_WholesalerUser] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
))

外鍵

ALTER TABLE [dbo].[WholesalerUser] WITH CHECK 
ADD CONSTRAINT [FK_WholesalerUser_Customer] 
FOREIGN KEY([CustomerId], [IsWholesaler])
REFERENCES [dbo].[Customer] ([Id], [IsWholesaler])
GO

ALTER TABLE [dbo].[WholesalerUser] 
CHECK CONSTRAINT [FK_WholesalerUser_Customer]
GO

檢查約束

ALTER TABLE [dbo].[WholesalerUser] WITH CHECK 
ADD CONSTRAINT [CK_WholesalerUser] 
CHECK (([IsWholesaler]=(1)))
GO

ALTER TABLE [dbo].[WholesalerUser] 
CHECK CONSTRAINT [CK_WholesalerUser]
GO

ALTER TABLE [dbo].[WholesalerUser] 
ADD CONSTRAINT [DF_WholesalerUser_IsWholesaler] 
DEFAULT ((1)) FOR [IsWholesaler]
GO

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM