簡體   English   中英

如何獲得外鍵的入門鍵值

[英]How to get primery key value to foreign key

我有3張桌子,一張是Userdoctorpatient User表具有通用屬性,例如IDNameEmail 我已經使用用戶表的主鍵和醫生表的外鍵連接了兩個表。 我使用2個SQL Server查詢來插入數據。

外鍵不會自動從用戶表ID列中獲取值。 代替doctor表的外鍵列將與其他插入的數據一起更新為“空”。

我想將用戶表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 Server數據庫

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

觸發觸發器時,它會向Doctor表中插入一個具有userID的行(其他列為null),然后運行Doctor表插入查詢,它將插入除userID之外的所有詳細信息。

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

在SQL Server中實現此目的的最佳方法是OUTPUT子句,該子句在此處記錄

基本思路如下:

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字段。 您可以撤回插入的任何字段。
  • 它不限於單行插入。

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/zh-CN/library/ms190315(v=sql.120).aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM