如何使用外键更新两个表

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() 而不是其他任何东西(如@@identityident_current)来获取新插入的标识值。 See this blog post for an explanation as to WHY

以上是关于如何使用外键更新两个表的主要内容,如果未能解决你的问题,请参考以下文章

数据库建表时候如何通过鼠标设置外键,不用语句

如何修复“无法添加或更新子行:外键约束失败”[重复]

我如何使用条件从其他表中更新表中的数据

如何使用外键创建 mysql 表?

sql数据库中如何做到表与表之间字段的同步更新删除?

使用 ASP.NET 动态数据/LINQ to SQL,如何让两个表字段与同一个外键有关系?