如何使用外键更新两个表
Posted
技术标签:
【中文标题】如何使用外键更新两个表【英文标题】:How to update two tables with foreign key 【发布时间】:2015-12-26 18:45:31 【问题描述】:我想将新客户插入数据库。 为此,我必须输入表 CLIENT FirstName、LastName、Postcode。在第二张表 CLIENTGROUP 中,我必须输入客户组,例如访客或 VIP。 First Tables Id 是第二个外键。
当我在 CLIENT 中添加新客户时,ID 会自动增加。如何进行查询以更新 CLIENTGROUP 中的 id? 我将不得不加入两个查询
var connection = OpenConnection();
var command = connection.CreateCommand();
command.CommandText = "insert into Klient(FirstName,LastName,Postcode) values (@FirstName, @LastName, @Postcode)";
AddParameterString(command, "@FirstName", model.FirstName);
AddParameterString(command, "@LastName", model.LastName);
AddParameterDecimal(command, "@Turnover", model.Postcode);
command.ExecuteNonQuery();
command.CommandText = "insert into ClientGroup (ClientGroup) values (@ClientGroup)";
AddParameterString(command, "@ClientGroup", model.ClienGroup);"
command.ExecuteNonQuery();
但我根本不知道怎么做。
【问题讨论】:
How do I ask a good question? 【参考方案1】:将SELECT SCOPE_IDENTITY()
添加到第一个插入查询中,这将为您提供插入客户的ID。在 c# 端使用 ExecuteScalar
方法(如果您使用 ADO.NET)。查询:
INSERT INTO Customer (/*...*/) VALUES (/*...*/)
SELECT SCOPE_IDENTITY()
c#:
var connection = OpenConnection();
var command = connection.CreateCommand();
command.CommandText = @"
insert into Klient(FirstName,LastName,Postcode) values (@FirstName, @LastName, @Postcode)
SELECT SCOPE_IDENTITY()";
AddParameterString(command, "@FirstName", model.FirstName);
AddParameterString(command, "@LastName", model.LastName);
AddParameterDecimal(command, "@Turnover", model.Postcode);
int customerId = (int) command.ExecuteNonQuery();
// ...use customerId in the second insert
您也可以考虑用事务包装这两个插入查询。
【讨论】:
【参考方案2】:您的代码将如下所示。还假设 ClientId
是您的主键列的名称。还为您的外键设置自动递增关闭(在ClientGroup
表中)。
var connection = OpenConnection();
var command = connection.CreateCommand();
command.CommandText = "insert into Klient(FirstName,LastName,Postcode) values (@FirstName, @LastName, @Postcode) Select Ident_Current('Klient')";
AddParameterString(command, "@FirstName", model.FirstName);
AddParameterString(command, "@LastName", model.LastName);
AddParameterDecimal(command, "@Turnover", model.Postcode);
int foreignKey = command.ExecuteScaler();
command.CommandText = "insert into ClientGroup (ClientId,ClientGroup) values (@ClientId, @ClientGroup)";
AddParameterString(command, "@ClientId", foreignKey);
AddParameterString(command, "@ClientGroup", model.ClienGroup);
command.ExecuteNonQuery();
【讨论】:
我建议使用SCOPE_IDENTITY()
而不是其他任何东西(如@@identity
或ident_current
)来获取新插入的标识值。 See this blog post for an explanation as to WHY以上是关于如何使用外键更新两个表的主要内容,如果未能解决你的问题,请参考以下文章