gpt4 book ai didi

sql-server - SQL Server 约束不会保存我定义它的方式

转载 作者:行者123 更新时间:2023-12-04 01:14:59 24 4
gpt4 key购买 nike

我之前注意到,当我通过 GUI 创建 SQL Server(或 Management Studio)时,它会“调整”检查约束。大多数时候它工作正常且正确。但是这个特定的约束每次都会改变。我什至尝试用脚本来做,但每次都会恢复到不正确的状态。为什么?

这是我运行的:

ALTER TABLE [dbo].[DSPTripAssignment] WITH CHECK 
ADD CONSTRAINT [CK_DSPTripAssignment_CarrierKey_DriverKey]
CHECK (([CarrierKey] IS NULL AND NOT [DriverKey] IS NULL)
OR ([DriverKey] IS NULL AND NOT [CarrierKey] IS NULL))
GO

这就是它恢复到的状态(参见 OR 周围缺少的大括号 - 杀死逻辑)

ALTER TABLE [dbo].[DSPTripAssignment] WITH CHECK 
ADD CONSTRAINT [CK_DSPTripAssignment_CarrierKey_DriverKey]
CHECK (([CarrierKey] IS NULL AND NOT [DriverKey] IS NULL
OR [DriverKey] IS NULL AND NOT [CarrierKey] IS NULL))
GO

或者,也许您可​​以建议如何更好地编写此支票?我想确保指定其中一个键,而不是同时指定两个键。

最佳答案

事实上,它并没有扼杀逻辑。在 T-SQL 中,precedence变为 NOT > AND > OR,所以

A AND NOT B OR C AND NOT D

相同
(A AND (NOT B)) OR (C AND (NOT D))

省略了多余的括号。检查定义确实会被重写为可读性较差的规范形式,但这不会导致检查不正确。

您的实际检查定义很好——虽然您可以使用 ISNULL/COALESCE/CASE 重写,但这很可能会进行检查效率较低。但是,您可以将 NOT X IS NULL 重写为 X IS NOT NULL,我认为这样更具可读性:

([CarrierKey] IS NULL AND [DriverKey] IS NOT NULL) OR ([DriverKey] IS NULL AND [CarrierKey] IS NOT NULL)

如果您不喜欢 SQL Server 将重写约束这一事实,您可以使用不会被重写的形式:

([CarrierKey] IS NULL OR [DriverKey] IS NULL) AND ([DriverKey] IS NOT NULL OR [CarrierKey] IS NOT NULL)

这可以分为两个约束,但由于它们本身没有多大意义,所以我将它们放在一起。

关于sql-server - SQL Server 约束不会保存我定义它的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28726159/

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