【问题标题】:How to insert data into two tabels?如何将数据插入两个表?
【发布时间】:2019-02-11 16:16:07
【问题描述】:

我有两张桌子FILM(Id, Title, Director, Year, Category)Record(Id, Film_id)

FILM 表中的Id 用作Film_idRecord 表中的外键。

我想在两个表中同时插入数据。如何用 INSERT 构造 sql 查询?

using (var connection = new MySqlConnection(constring))
{
    connection.Open();
    using (var cmdDataBase = connection.CreateCommand())
    {   
        cmdDataBase.CommandText = "INSERT INTO film(Title, Director, Year, Category) VALUES (@Title, @Director, @Year, @Category) ";
        cmdDataBase.Parameters.Add(new MySqlParameter("@Title", fm.Title));
        cmdDataBase.Parameters.Add(new MySqlParameter("@Director", fm.Director));
        cmdDataBase.Parameters.Add(new MySqlParameter("@Year", fm.Year));
        cmdDataBase.Parameters.Add(new MySqlParameter("@Category",n));

        cmdDataBase.ExecuteNonQuery();
    }
}

【问题讨论】:

  • 我不明白你的目的是什么。哪两个标签?我在 Record 表中只看到 ID 和 Film_Id。
  • 为什么要在两个不同的表中保存相同的值?
  • @ErayBalkanli - 似乎他想用外键关系同时填充filmrecord 两个表。所以他的问题基本上是How to insert a record with foreign relations? - 至少我是这么理解的:)
  • 只需在记录表中添加第二个插入。
  • @jdweng 但是外键是什么,那么他如何将表filmid填充到相关表record的列​​film_id

标签: c# mysql sql


【解决方案1】:

您将获得最后一个自动生成的 ID 为 LAST_INSERT_ID()。然后,您将使用事务,因为您不想插入父记录,如果您也不能插入子记录,或者我理解。

或多或少是这样。当然,您应该添加错误处理(trycatch)。

// Start transaction
MySqlTransaction transaction = connection.BeginTransaction();

MySqlCommand command = new MySqlCommand();
command.Connection = connection;
command.Transaction = transaction;

// Parent record
command.CommandText = "INSERT INTO film(Title, Director, Year, Category) VALUES (@Title, @Director, @Year, @Category) ";
command.Parameters.Add(new MySqlParameter("@Title", fm.Title));
command.Parameters.Add(new MySqlParameter("@Director", fm.Director));
command.Parameters.Add(new MySqlParameter("@Year", fm.Year));
command.Parameters.Add(new MySqlParameter("@Category",n));
command.ExecuteNonQuery();

// Child record        
command.CommandText = "INSERT INTO record (Film_id) VALUES (LAST_INSERT_ID())";
command.ExecuteNonQuery();

// Commit inserts
transaction.Commit();

【讨论】:

    【解决方案2】:

    您需要按顺序执行。首先,将记录添加到您的主表 Film,然后是其他表 Record。检查以下:

    INSERT INTO Film(Title, Director, Year, Category)
    VALUES('Title', 'DirectorName', 1990, 'Action');
    
    --Assuming ID for Record table is AUTO_INCREMENT column
    INSERT INTO Record(Film_id)
    VALUES ((SELECT id FROM Film WHERE Title='Title' and Director='Director'));
    

    另外,可以使用 LAST_INSERT_ID():

    INSERT INTO Film
    ...
    
    INSERT INTO Record
    ...
    film_id = LAST_INSERT_ID()
    

    参考:Mysql: How to insert values in a table which has a foreign key

    【讨论】:

      【解决方案3】:

      如果您使用的是 MySQL,请尝试在查询末尾添加 ;return LAST_INSERT_ID(); 并添加返回参数,如下所示。

      var returnVal = cmdDataBase.Parameters.Add("@ReturnVal", SqlDbType.Int);
      returnVal.Direction = ParameterDirection.ReturnValue;
      

      cmdDataBase.ExecuteNonQuery();之后从returnVal中提取id

      var id = returnParameter.Value;
      

      之后,您可以使用id 执行第二次插入。

      【讨论】:

      • 出于好奇,为什么不用ExecuteScalar(); 而不是ExecuteNonQuery();
      • @RandRandom:我不确定,只是我的偏好。还有细微的差别。 ExecuteScalar 返回第一行的第一列。所以我希望我们将使用 'SELECT LAST_INSERT_ID()' 而不是 return LAST_INSERT_ID();
      • 自从我上一次真正自己编写 SQL(尽管是 mysql)已经很久了,所以我真的不了解自己。 :) - ORM 耗尽我的 SQL 知识的速度比我想承认的要快。 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-17
      • 1970-01-01
      • 1970-01-01
      • 2019-02-14
      • 1970-01-01
      • 2014-07-22
      • 1970-01-01
      相关资源
      最近更新 更多