Scope_Identity链接2个表

时间:2015-04-07 08:09:14

标签: sql sql-server

我有两张桌子 -

create table Category    
(
    CategoryId int identity (1,1) not null,     
    Name varchar (40) not null,

    constraint PK_Category  primary key (CategoryId) 
)
GO

create table Product
(
    ProductId int identity (1,1) not null,
    CategoryId int not null,
    Name varchar(40) not null,    

    constraint PK_Product primary key (ProductId),
    constraint FK_Product_Category foreign key (CategoryId) references Category (CategoryId)
)
GO

我在SQL中尝试做的是,只要在CategoryId表中输入Category,它就会显示在CategoryId表的Product中,就像您一样可以看到它是Product表中的外键。

我已阅读有关scope_identity和触发器的内容,但我不知道从哪里开始。

任何帮助都非常感激。

谢谢

1 个答案:

答案 0 :(得分:0)

您假设无论何时添加类别,其CategoryID都应出现在Products CategoryID列中,这是错误的。

实际添加具有该类别的产品时,它只会出现在Products表的CategoryID列中。

您可以创建一个存储过程来为您添加产品和类别,它会检查是否存在类别并为该类别抓取categoryId,如果某个类别没有退出则会为您添加。

像......那样的东西。

程序定义

CREATE PROCEDURE Insert_Product 
 @CategoryName  VarChar(40)
,@ProductName   VarChar(40)
,@ProductID     Int OUTPUT
AS
BEGIN
  SET NOCOUNT ON;

DECLARE @CategoryID INT;

SELECT @CategoryID = CategoryId FROM Category WHERE Name = @CategoryName

    IF (@CategoryID IS NULL)
    BEGIN
       INSERT INTO Category(Name)
       VALUES (@CategoryName)

       SET @CategoryID = SCOPE_IDENTITY();
    END

IF EXISTS(SELECT 1 FROM Product
          WHERE CategoryId = @CategoryId AND Name = @ProductName)
   BEGIN
      RAISERROR('Product already exists' ,16,1)
      SET @ProductID = 0;
      RETURN;
   END
ELSE 
  BEGIN
    INSERT INTO Product (CategoryId , Name)
    VALUES (@CategoryID , @ProductName)
      SET @ProductID = SCOPE_IDENTITY();
  END
END

程序执行

DECLARE @ProductID INT;
EXEC Insert_Product @CategoryName = 'Dairy'
                   ,@CategoryName = 'Milk'
                   ,@ProductID    = @ProductID OUTPUT