SCOPE_IDENTITY()id的冲突

时间:2012-09-14 17:50:11

标签: sql sql-server

我有3张表UniversityRegSupporterReg& Login。如果大学或支持者在系统中注册,总是会将详细信息发送到他们的表格和登录详细信息转到Login表。在这里,我使用scope_identity

当我去保存支持者注册详情时,我收到了错误。

错误

  

Msg 515,Level 16,State 2,Procedure SupporterReg_SP,第16行
  无法将值NULL插入列'SupporterId',表'CounsellingDB.dbo.SupporterReg';列不允许空值。 INSERT失败。

     

Msg 515,Level 16,State 2,Procedure SupporterReg_SP,Line 20
  无法将值NULL插入列'LoginID',表'CounsellingDB.dbo.Login';列不允许空值。 INSERT失败。

UniversityReg SP

ALTER PROCEDURE [dbo].[UniversityReg_SP]
  (
@Username varchar(50),
@Password varchar(50),
@UniversityName varchar(50) ,
@GovernmentRegNo varchar(50) ,
@Country varchar(50) ,
@CreatedBy varchar(50)

    )
AS
DECLARE @LoginID int
INSERT INTO UniversityReg   (UniversityName,GovernmentRegNo,Country,CreatedBy,ShortCode)values(@UniversityName,@GovernmentRegNo,@Country,@CreatedBy,'UNI')

SET @LoginID = SCOPE_IDENTITY();

INSERT INTO Login values(@LoginID,@Username,@Password,'UNI')

RETURN

SupporterReg_SP

CREATE PROCEDURE [dbo].[SupporterReg_SP]
   (
@UserName varchar(50),
@Password varchar(50),
@SupporterName varchar(50),
@University varchar(50) ,
@ContactNo varchar(50),
@Email varchar(50),
@StudentLocation varchar(50) 


       )

          AS
       DECLARE @LoginID int
        INSERT INTO   SupporterReg(SupporterName,University,ContactNo,Email,StudentLocation,ImagePath,ShortCode)V   alues(@SupporterName,@University,@ContactNo,@Email,@StudentLocation,'','SUP')

SET @LoginID = SCOPE_IDENTITY();

INSERT INTO Login values(@LoginID,@UserName,@Password,'SUP')

RETURN

UniversityReg Table

[UniversityId] [int] IDENTITY(1,1) NOT NULL,
[Username] [varchar](50) NULL,
[Password] [varchar](50) NULL,
[UniversityName] [varchar](50) NULL,
[GovernmentRegNo] [varchar](50) NULL,
[Country] [varchar](50) NULL,
[CreatedBy] [varchar](50) NULL,
[ShortCode] [varchar](50) NULL,

登录表

[LoginID] [int] NOT NULL,
[UserName] [nvarchar](50) NOT NULL,
[Password] [nvarchar](50) NOT NULL,
[ShortCode] [nvarchar](50) NULL

SupporterReg表

[SupporterId] [int] NOT NULL,
[SupporterName] [varchar](50) NULL,
[University] [varchar](50) NULL,
[ContactNo] [varchar](50) NULL,
[Email] [varchar](50) NULL,
[StudentLocation] [varchar](50) NULL,
[ImagePath] [varchar](50) NULL,
[ShortCode] [varchar](50) NULL,

3 个答案:

答案 0 :(得分:0)

在您的存储过程中,@LoginID是SupporterReg或UniversityReg的ID,而非登录

在Login中,您的LoginID列应定义为int identity(1,1),您应在插入中指定列名称

INSERT INTO Login (column, names, go here)
values(@LoginID,@UserName,@Password,'SUP') 

答案 1 :(得分:0)

您的问题是您的过程正在尝试将多个值插入到SupporterReg表中,但是您没有包含SupporterID列的值,该列已被定义为NOT NULL。

您可以将值与该insert语句一起传递,也可以调整表DDL以使其成为IDENTITY列,并为您填充该数据。

答案 2 :(得分:0)

你的设计错了。您不应该使用登录表中两个不同表的id作为loginid。这是一个在实践中无法工作的模型,因为这两个表迟早会具有相同的ID,并且您将不知道登录与哪个表相关。你的父母子女关系发生逆转。

正确的设计是首先插入Login,使loginid成为身份。然后插入到UniversityReg或SupporterReg的子表中。执行此操作时,您可以拥有FK和参考完整性。