我正在尝试创建约束以验证关系是否存在
我试图创建一个过程,然后在检查约束中使用它。显然这似乎行不通。
这些是我的桌子:
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
插入颜色和。我当时正在考虑在过程中使用约束检查,但是无法解决查询。
答案 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
约束,我们确保不会插入重复的条目