簡體   English   中英

對2列中的任何一列的SQL唯一約束

[英]SQL unique constraint on either of 2 columns

我有一個SQL表,我希望有一個唯一的約束,以便兩個值中的任何一個都不能存在。

例如,如果我有2列,如果列B中的值不存在於列A或列B中,我希望它不插入。

這是可能的,如果是這樣,它是如何完成的?

例:

Column A | Column B
--------------------
     4   |   6

我希望任何試圖插入4或6的對象不允許進入表中

您可以創建一個函數,該函數接收這些值並在其上創建一個檢查約束(引用函數返回值)到表中。

create table t11 (Code int, code2 int)

create function fnCheckValues (@Val1 int, @Val2 int)
Returns int /*YOu can write a better implementation*/
as
Begin
 DECLARE @CntRow int  
 IF(@Val1 IS NULL OR @Val2 IS NULL) RETURN 0    
 select @CntRow = count(*)  from t11   
    where Code in (@Val1,@Val2 ) or Code2 in (@Val1,@Val2 ) 

 RETURN @CntRow  
End

GO

alter table t11 Add constraint CK_123 check ([dbo].[fnCheckValues]([Code],[code2])<=(1))

使用ROLLBACK TRANSACTION觸發是可行的方法。

create trigger dbo.something after insert as
begin
    if exists ( select * from inserted where ...check here if your data already exists... )
    begin
        rollback transaction
        raiserror ('some message', 16, 1)
    end
end

當想要強制執行數據庫引擎不提供的多行約束時,顯而易見的解決方案是使用觸發器或存儲過程。 這通常不起作用,因為數據庫隔離了觸發器和存儲過程運行的事務,允許違反並發性。

而是將約束轉換為數據庫引擎將強制執行的操作。

CREATE TABLE dbo.T (A INT, B INT)
GO

CREATE TABLE dbo.T_Constraint_Helper (ColumnName sysname PRIMARY KEY)
INSERT INTO dbo.T_Constraint_Helper (ColumnName)
VALUES ('A'), ('B')
GO

CREATE VIEW T_Constraint_VW 
WITH SCHEMABINDING AS 
SELECT CASE CH.ColumnName WHEN 'A' THEN T.A ELSE T.B END AS Value
FROM dbo.T
CROSS JOIN dbo.T_Constraint_Helper CH
GO

CREATE UNIQUE CLUSTERED INDEX FunnyConstraint_VW_UK ON dbo.T_Constraint_VW (Value)
GO

INSERT INTO T VALUES (1, 2)
-- works
INSERT INTO T VALUES (2, 3)
-- Msg 2601, Level 14, State 1, Line 1
-- Cannot insert duplicate key row in object 'dbo.T_Constraint_VW' with unique index 'T_Constraint_VW_UK'. The duplicate key value is (2).
INSERT INTO T VALUES (4, 4)
-- Msg 2601, Level 14, State 1, Line 1
-- Cannot insert duplicate key row in object 'dbo.T_Constraint_VW' with unique index 'T_Constraint_VW_UK'. The duplicate key value is (4).
INSERT INTO T VALUES (5, 6)
-- works

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM