sql - 在两列组合 MSSQL 上创建约束
问题描述
我有一个包含两个列名Parent和Child的表, 其数据如下所示。
| Parent | Child |
|---------------------|------------------|
| 100 | 101 |
|---------------------|------------------|
我还在这两列上添加了唯一约束,命令如下:
ALTER TABLE Example ADD CONSTRAINT UC_Example UNIQUE (parent,child);
现在,如果我尝试在父 项中插入100 ,在子项中插入101,则失败,这是正确的,但我也想停止反向插入示例:父项中的101和子项中的100也应该失败
有没有办法使用 sql 或 Procedure 或任何预定义的 sql 命令
解决方案
这是一个带有函数约束的示例:
CREATE TABLE Tab1 (
Parent INT
,Child INT
)
INSERT INTO Tab1
VALUES (100,101),(100,102)
GO
---------------------------------------------------------------------------------------------------------------------------
CREATE FUNCTION dbo.fnc_RestrictedInsert (@NewParent INT, @NewChild INT)
RETURNS BIT
AS
BEGIN
DECLARE @Count INT = 0;
DECLARE @RetVal BIT = 1;
SELECT @Count = COUNT(*)
FROM Tab1
WHERE (Parent = @NewParent AND Child = @NewChild)
OR (Child = @NewParent AND Parent = @NewChild)
SET @RetVal = CASE
WHEN @Count > 1
THEN 0
ELSE 1
END
RETURN @RetVal;
END
---------------------------------------------------------------------------------------------------------------------------
ALTER TABLE Tab1 WITH NOCHECK ADD CONSTRAINT [CK_Ins] CHECK (([dbo].[fnc_RestrictedInsert]([Parent], [Child]) = (1)))
---------------------------------------------------------------------------------------------------------------------------
INSERT INTO Tab1 VALUES (100,101)
INSERT INTO Tab1 VALUES (101,100)
INSERT INTO Tab1 VALUES (100,103)
推荐阅读
- junit - 在 JUnit 5 中将 `Supplier` 作为消息提供者的选项的实际用途
- python - 将 MongoDB 文档中的嵌套字段组合成 python 数组
- java - Java 9 模块化应用程序中的 Logback 不起作用
- sql-server - 如何将 SQL Server Express 架构转储到 github?
- c# - C# 跳过 DispatcherOperation
- c# - 如何使用 C# 在 Systray 应用程序中动态添加菜单项
- android - Uber、Swiggy、Rapido 等 Android 应用程序如何能够在没有任何特殊许可的情况下在其他应用程序上绘制小地图?
- maven - 参数化版本,如 Spring Boot
- visual-studio-code - 记录映射到多个命令的快捷方式的 vscode 命令执行
- bash - 我如何在 bash 中使用“Last”命令来查看最近 30 秒内谁登录?