sql - 创建对两个列组合MSSQL的约束

标签 sql sql-server stored-procedures sql-server-2005

我有一个表,其中有两个列名称父级子级,数据如下所示。

|     Parent          |     Child        |
|---------------------|------------------|
|      100            |      101         |
|---------------------|------------------|

我还在这两列上添加了唯一约束,命令如下:

ALTER TABLE Example ADD CONSTRAINT UC_Example UNIQUE (parent,child);

现在,如果我尝试在父项中插入 100 并在子项中插入 101 ,则会失败,这是正确的,但我也想停止反向插入 示例:父级中的 101 和子级中的 100 也应该失败

有没有办法使用 sql 或过程或任何预定义的 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)

关于sql - 创建对两个列组合MSSQL的约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50737845/

相关文章:

sql-server - SQL CONTAINSTABLE 和通配符

sql-server - SQL Server - 值得为大字符串键建立索引吗?

Java存储过程: OUT params

c# - 过程或函数需要未提供的参数

php - MYSQL 根据多行从表中选择

php - 为不同的数据库引擎实现数据映射器时如何防止重复?

sql - 将大字符串值设置为 CLOB 时抛出 "PLS-00172: string literal too long"错误

c# - 如何从 SQL Server 缓存一个大表

MYSQL 函数/过程

mysql - 如何将此 MySQL SELECT 查询转换为 DELETE 查询?