Sql 范围\标识链接2个表

Sql 范围\标识链接2个表,sql,sql-server,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, Ca

我有两张桌子-

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中尝试做的是,每当在Category表中输入CategoryId时,它就会出现在Product表的CategoryId中,正如您可以看到的,它是Product表中的外键

我已经读过关于scope_标识和触发器的内容,但是我不确定从哪里开始

非常感谢您的帮助


谢谢

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

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

您可以创建一个存储过程来为您添加产品和类别,该过程检查是否存在类别并获取该类别的categoryId,如果类别未退出,则为您添加

程序定义 程序执行
MySQL还是SQL Server?不要给未涉及的产品贴标签。。。你知道,这两个产品有非常不同的触发器…很抱歉,它是SQL Server
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