【问题标题】:I am storing identity value of one table to another table in the foreign key but when make relationship it gives me error我将一个表的标识值存储到外键中的另一个表但是当建立关系时它给了我错误
【发布时间】:2016-11-06 17:31:52
【问题描述】:

我将一个表的标识值存储到外键中的另一个表中,但是在尝试创建关系时,出现错误 332。

ALTER proc [dbo].[spRegisterUser]
    @Doj date,
    @UserName nvarchar(100),
    @Password nvarchar(10),
    @Reference nvarchar(50),
    @Aadhar nvarchar(50),
    @Email nvarchar(50)
AS
BEGIN
    Declare @count int
    Declare @ReturnCode int

    Select @count = COUNT(UserName)
    from tblUsers where UserName = @UserName
    if @count > 0
    Begin
        Set @ReturnCode = -1
    End
    Else
    Begin   
        Set @ReturnCode = 1 

        insert into tblUsers (DoJ,UserName,Password,Reference,Aadhar,Email) 
        Output inserted.User_ID into tblUserProfiles(UserID)
        values (@DoJ,@UserName,@Password,@Reference,@Aadhar,@Email)
    End
    Select @ReturnCode as ReturnValue
end     

错误是:

OUTPUT INTO 子句的目标表“tblUserProfiles”不能位于(主键、外键)关系的任一侧。找到引用约束“FK_tblUserProfiles_tblUsers”。

如何克服这个问题?我需要 PK FK 关系,我还希望 FK 值自动保存在列中。

请为我找到解决方案。谢谢

【问题讨论】:

  • 一些代码怎么样?你如何创建你的数据库?没有这些信息,就不可能找出错误。
  • 您正在插入一条记录。没有理由完全使用输出子句。只需使用一个变量来保存@@SCOPE_IDENTITY 就可以了
  • @cha 。 . .这真的是非常非常糟糕的建议。从insert 返回 id 的正确方法是 OP 使用 OUTPUT 的方式。
  • @rahul 。 . .我建议先将值放入表变量中,然后将数据从那里加载到最终表中。
  • @GordonLinoff 为什么在这种情况下使用scope_identity() 是一个糟糕的建议?我理解插入多条记录时需要输出子句,但插入单条记录时为什么不使用scope_identity()

标签: c# sql asp.net .net sql-server-2008


【解决方案1】:

由于这个存储过程实际上只插入一个单行数据,您可以使用以下代码:

declare @NewUserID INT

insert into tblUsers (DoJ, UserName, Password, Reference, Aadhar, Email) 
values (@DoJ, @UserName, @Password, @Reference, @Aadhar, @Email);

-- get the newly created ID for the new user
SELECT @NewUserID = SCOPE_IDENTITY();

-- insert into the other table
INSERT INTO dbo.tblUserProfiles (UserID)
VALUES (@NewUserID);

这假定tblUsers 表中的User_ID 列实际上是一个Identity 列。

【讨论】:

    【解决方案2】:

    另一种选择是在用户表上使用插入触发器,只要将记录插入到用户表中,就会将记录插入到用户配置文件表中。这种方法的优点是即使用户直接插入到您的表中(我的意思是,不使用您的存储过程),他们仍然会在用户配置文件表中创建一条记录:

    CREATE TRIGGER tblUsers_INSERT ON tblUsers 
    FOR INSERT
    AS
    BEGIN
    
        INSERT INTO tblUserProfiles(UserId)
        SELECT User_ID 
        FROM Inserted
    
    END
    

    【讨论】:

      猜你喜欢
      • 2021-11-28
      • 2016-12-02
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多