如何限制插入已存在于其他表中的值

问题描述:

我有2个表。如果该值存在于其他表中,则需要在插入到一个表之前进行检查。如何限制插入已存在于其他表中的值

+1

您是否需要为单个操作或* any *插入操作限制插入? – 2011-06-15 02:21:26

+1

对于所选表格上的任何插入操作 – user194076 2011-06-15 02:22:24

我建议,你应该先检查是否打算在每个要插入的记录请求。

Create Proc Testing 
as 
Set NoCount ON 
Set XACT_ABORT ON 

Begin Try 
    Begin Tran 
    IF Not Exists(SELECT 1 FROM Table2 i JOIN Table1 t ON i.key = t.key) 
    Begin 
     //Your insert statement 
    END 
    Commit Tran 
End Try 

Begin Catch 
    Rollback Tran 
End Catch 
+0

这并不能完全回答问题。这将检查该值是否存在于两个表中。问题是如何在插入'Table2'之前检查它是否在'Table1'中。如果值仅存在于“表格1”中,您的代码将允许插入。 – NullRef 2011-06-15 22:08:01

使用INSERT trigger也许?

我对语法不太确定。

CREATE TRIGGER InsertTableTrigger ON Table1 FOR INSERT 
AS 
    BEGIN 
    IF EXISTS (SELECT 1 FROM Inserted i JOIN Table1 t ON i.key = t.key) 
    BEGIN 
     RAISERROR('Transaction Failed.',16,1) 
     ROLLBACK TRAN "insert on Table1" 
    END 
    END 
GO 

插入用于访问插入值。

+0

如何使用插入值? – user194076 2011-06-15 02:16:24

+0

更新了答案。您使用插入来访问值。 – Lobo 2011-06-15 02:27:33

+2

假设我插入了一批100条记录。在100个中,它已经在其他表中包含40个记录,并且60个是新的记录。根据上面的说法,它应该回滚完整的批量! – Pankaj 2011-06-15 04:44:48

IF NOT EXISTS(SELECT * FROM表A WHERE Col1中= @Value) INSERT INTO表B(Col1中)选择@Value

+0

我认为,提及列名而不是明星更好。 – Pankaj 2011-06-15 08:00:20

+0

我几年前看到过一篇关于它的文章,从SQL 2005开始,优化器将*,1或列名称视为EXISTS语句内部相同。我将它们进行了几次比较,执行计划是确切的。 – Natalia 2011-06-16 00:33:40