如何获得外键的primery键值

时间:2016-03-19 12:03:09

标签: sql sql-server database foreign-keys primary-key

我有3个表,一个是UserdoctorpatientUser表具有常见属性,例如IDNameEmail。我使用用户表的主键和医生表的外键连接了两个表。我使用2个SQL服务器查询来插入数据。

外键不会自动从用户表ID列获取值。而不是doctor表外键列更新为' null'与其他插入的数据。

我想将用户表PK值提供给医生表FK

这是我在asp.net中将数据插入数据库的方式

sda.InsertCommand = new SqlCommand("Insert into sysUser(userPassword, userType,firstName,lastName,age,dateOfBirth,gender,telephoneNumber,email,userAddress,country) VALUES (@signUpPw, @signUserType,@signUpFname,@signUpLname, @signupAge, @signupDateOfBirth,@signupGender,@signUpTp, @signUpEmail, @signUpAddr, @signUpCountry);", con);

            sda.InsertCommand.Parameters.Add("@signUpPw", SqlDbType.VarChar).Value = newDoctor.getUserPassword();
            sda.InsertCommand.Parameters.Add("@signUserType", SqlDbType.VarChar).Value = "Doctor";/*userType*/
            sda.InsertCommand.Parameters.Add("@signUpFname", SqlDbType.VarChar).Value = newDoctor.firstName;
            sda.InsertCommand.Parameters.Add("@signUpLname", SqlDbType.VarChar).Value = newDoctor.lastName;
            sda.InsertCommand.Parameters.Add("@signupAge", SqlDbType.VarChar).Value = newDoctor.age;

            sda.InsertCommand.Parameters.Add("@signupDateOfBirth", SqlDbType.VarChar).Value = newDoctor.dateOfBirth;
            sda.InsertCommand.Parameters.Add("@signupGender", SqlDbType.VarChar).Value = newDoctor.gender;
            sda.InsertCommand.Parameters.Add("@signUpTp", SqlDbType.VarChar).Value = newDoctor.telephoneNumber;
            sda.InsertCommand.Parameters.Add("@signUpEmail", SqlDbType.VarChar).Value = newDoctor.email;
            sda.InsertCommand.Parameters.Add("@signUpAddr", SqlDbType.VarChar).Value = newDoctor.userAddress;
            sda.InsertCommand.Parameters.Add("@signUpCountry", SqlDbType.VarChar).Value = newDoctor.country;

              con.Open();
              int id = sda.InsertCommand.ExecuteNonQuery();


            sda.InsertCommand = new SqlCommand("Insert into doctor(userID,docTitle, specialityArea, qualifications) VALUES (@signupTitle, @SignupSpecialityArea, @signupQualifications)", con);

            sda.InsertCommand.Parameters.Add("@signupTitle", SqlDbType.VarChar).Value = newDoctor.title;
            sda.InsertCommand.Parameters.Add("@SignupSpecialityArea", SqlDbType.VarChar).Value = newDoctor.specialArea;
            sda.InsertCommand.Parameters.Add("@signupQualifications", SqlDbType.VarChar).Value = newDoctor.qualifications;


            sda.InsertCommand.ExecuteNonQuery();
            con.Close();

这是SQL服务器数据库

create table sysUser
(userID INT IDENTITY(1,1) NOT NULL PRIMARY KEY, 
userPassword varchar(20) NOT NULL, 
userType varchar(20) NOT NULL, 
firstName varchar(30) NOT NULL, 
lastName varchar(30) NOT NULL, 
age varchar(20) NOT NULL, 
dateOfBirth varchar(20) NOT NULL, 
gender varchar(20) NOT NULL, 
telephoneNumber varchar(20) NOT NULL, 
email varchar(50) NOT NULL, 
userAddress varchar(100) NOT NULL, 
country varchar(50) NOT NULL); 

create table doctor(
docID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
userID int NOT NULL,
docTitle varchar(20),
specialityArea varchar(200),
qualifications varchar(100)
FOREIGN KEY (userID) REFERENCES sysUser (userID) ON UPDATE NO ACTION ON DELETE CASCADE
);

这是触发器

CREATE TRIGGER userID_copyTO_doc_FK ON sysUser
FOR INSERT
AS
BEGIN
declare @id int
select @id = userID from inserted  
insert into doctor(userID)
select (@id)
END

当触发器触发时,它会将带有userID的行插入到医生表中(其他列为空) 然后医生表插入查询运行,它插入除userID之外的所有细节。

我得到2行,我想要一行。 :(

2 个答案:

答案 0 :(得分:3)

SQL Server中最好的方法是OUTPUT子句,记录为here

基本理念如下:

declare @user_ids table (user_id int);

insert into user( . . .)
    output inserted.user_id into @user_ids;
    select . . . ; -- or `values (. . .)`;

然后您可以将其用于后续处理:

insert into patient(user_id, . . .)
    select user_id, . . .
    from @user_ids;

使用SCOPE_IDENTITY()@@IDENTITY或类似方法的优势:

  • 没有“最后”修改的概念。这只是找到特定语句专门插入(或更新或删除)的ID。
  • 您可以退回的不只是新的ID字段。您可以撤回已插入的任何字段。
  • 不限于单行插入。

答案 1 :(得分:1)

SCOPE_IDENTITY函数应返回最后插入的自动增量id值:

declare @user_id int

insert into user (...)
values (...)

set @user_id = SCOPE_IDENTITY()

insert into doctor(user_id, ...)
values (@user_id, ...

https://msdn.microsoft.com/en-us/library/ms190315(v=sql.120).aspx