繁体   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