SQL Server:检查约束是否存在关系,否则插入

时间:2018-11-30 12:59:54

标签: sql-server

我正在尝试创建约束以验证关系是否存在

我试图创建一个过程,然后在检查约束中使用它。显然这似乎行不通。

这些是我的桌子:

STOCKITEMS表:

StockItemId      INT
StockItemName    VARCHAR
ColorId          INT

COLOR表:

ColorId          INT
ColorName        VARCHAR

这是我的存储过程:

CREATE PROCEDURE USP_ValidateColor
    (@Color NVARCHAR(50))
AS
    IF NOT EXISTS(SELECT ColorName FROM WareHouse.Colors WHERE ColorName = @Color) 
    BEGIN
        DECLARE @Id INT
        SET @Id = (SELECT TOP(1) ColorId + 1 FROM Warehouse.Colors 
                    ORDER BY ColorId DESC)

        INSERT INTO Warehouse.Colors 
        VALUES (@Id, @Color)

        PRINT 'Does not exist'; 
    END;
    ELSE 
        PRINT 'Exists'; 

因此,如果用户将一个库存商品插入表中,我希望进行检查以检查颜色表中是否已经存在colorId

如果没有,则将colorname插入颜色和。我当时正在考虑在过程中使用约束检查,但是无法解决查询。

2 个答案:

答案 0 :(得分:1)

不要使用SP来检查约束,请使用外键:

CREATE TABLE Colour (ColourID int PRIMARY KEY, --This should really have a name
                     ColourName varchar(20));

CREATE TABLE StockItem (StockItemID int PRIMARY KEY, --This should really have a name too
                        StockItemName varchar(20),
                        ColourID int);

ALTER TABLE dbo.StockItem ADD CONSTRAINT Colour_FK FOREIGN KEY (ColourID) REFERENCES dbo.Colour(ColourID);

然后,如果您尝试将某些内容插入StockItem表中,除非颜色存在,否则它将失败:

INSERT INTO dbo.Colour (ColourID,
                        ColourName)
VALUES (1,'Green'),(2,'Blue');
GO

INSERT INTO dbo.StockItem (StockItemID,
                           StockItemName,
                           ColourID)
VALUES(1,'Paint',1); --works
GO
INSERT INTO dbo.StockItem (StockItemID,
                           StockItemName,
                           ColourID)
VALUES (1,'Wood Panels',3); --fails

GO

--clean up
DROP TABLE dbo.StockItem;
DROP TABLE dbo.Colour;

答案 1 :(得分:0)

对于检查,请使用UNIQUE检查约束。如果仅在颜色不存在时才要插入颜色,请使用INSERT .. FROM .. WHERE检查颜色是否存在并插入同一查询中。

唯一的“技巧”是FROM需要一个表。可以使用table value constructor从要插入的值中创建表来解决此问题。如果存储过程接受表值参数,则没有问题。

此示例使用LEFT JOIN插入不匹配的值:

declare @colors table (Color nvarchar(10) UNIQUE)

insert into @colors VALUES ('green')

select * from @colors;

insert into @Colors (Color)
select new.Color
from (VALUES ('red'),
             ('green')) new(Color)
    left outer join @Colors old on old.Color=new.Color
where old.Color is NULL

-- (1 row affected)

insert into @Colors (Color)
select new.Color
from (VALUES ('red'),
             ('green')) new(Color)
    left outer join @Colors old on old.Color=new.Color
where old.Color is NULL

-- (0 rows affected)

select * from @colors;
-- green
-- red

与子查询相同:

insert into @Colors (Color)
select new.Color
from 
    (VALUES ('red'),
            ('green')) new(Color)
where not exists (select 1 
                  from @colors 
                  where color=new.Color);

通过使用UNIQUE约束,我们确保不会插入重复的条目

相关问题