gpt4 book ai didi

sql-server - 防止具有相同 col1 和不同 col2 的行

转载 作者:行者123 更新时间:2023-12-02 00:00:48 34 4
gpt4 key购买 nike

是否可以创建约束以防止在相同的 Col1 上出现 different Col2,其中第一列不能为 NULL 而不是第二个?

为了阐明我的要求,请考虑单行的示例数据:

MaterialNumber(varchar50, not null)    fiModel(int, null, fk)
1234-4321 1

是否可以防止第二行具有相同的 MaterialNumber 但不同的 fiModel

Here's一个 sql-fiddle,第二个 INSERT 应该会失败,因为它是具有相同编号的不同模型。

如果链接失效:

(简化的)表格:

CREATE TABLE [dbo].[tabSparePartMasterData](
[MaterialNumber] [varchar](50) NOT NULL,
[fiModel] [int] NULL)

两行,第二个插入应该是不可能的:

INSERT INTO tabSparePartMasterData(MaterialNumber,fiModel)
VALUES('1234-4321', 1);
INSERT INTO tabSparePartMasterData(MaterialNumber,fiModel)
VALUES('1234-4321', 2);

请注意 fiModel 可以是 null,但如果它不是 null,则不可能添加另一行具有相同或不同 模型。我已经用计算列解决了 MaterialNumber + fiModel(not null) 上的唯一索引。但我一直在研究如何防止出现不同的 fiModel

最佳答案

您可以向表中添加一个持久化列以支持此条件约束。如果您不想更改此表,您可以使用投影 ChkMaterialNumber 列的 View 并对其施加唯一约束来实现相同的策略。

CREATE TABLE [dbo].[tabSparePartMasterData]
(
[YourPK] int identity(1,1) not null primary key,
[MaterialNumber] [varchar](50) NOT NULL,
[fiModel] [int] NULL
);
go

--add a computed column here to enforce the conditional constraint:
alter table [dbo].[tabSparePartMasterData] add [ChkMaterialNumber] as ( case when fiModel is null then cast(YourPK as varchar) else MaterialNumber end)

--now add unique constraint to the computed column:
create unique index ux_SparePartMasterData on [dbo].[tabSparePartMasterData]([ChkMaterialNumber]);
go



-- OK
INSERT INTO tabSparePartMasterData(MaterialNumber,fiModel)
VALUES('1234-4321', 1);

-- FAILS
INSERT INTO tabSparePartMasterData(MaterialNumber,fiModel)
VALUES('1234-4321', 2);

--OK
INSERT INTO tabSparePartMasterData(MaterialNumber,fiModel)
VALUES('1234-4321', null);

关于sql-server - 防止具有相同 col1 和不同 col2 的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21532904/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com