Как вставить данные в две таблицы? - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть две таблицы FILM(Id, Title, Director, Year, Category) и Record(Id, Film_id)

Id из FILM Таблица используется в качестве внешнего ключа как Film_id в Record таблице.

Я хочу вставить данные в одну и ту же дату в обе таблицы.Как построить SQL-запрос с INSERT?

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();
    }
}

Ответы [ 3 ]

0 голосов
/ 11 февраля 2019

Если вы используете MySQL, попробуйте добавить ;return LAST_INSERT_ID(); в конце вашего запроса и добавить возвращаемый параметр, как показано ниже.

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

После cmdDataBase.ExecuteNonQuery(); извлечь идентификатор из returnVal

var id = returnParameter.Value;

После этого вы можете использовать id для выполнения второй вставки.

0 голосов
/ 11 февраля 2019

Вы получите последний автоматически сгенерированный идентификатор с LAST_INSERT_ID().Тогда вы будете использовать транзакцию, потому что вы не хотите вставлять родительскую запись, если вы не можете также вставить дочернюю запись, или я так понимаю.

Это более или менее.Вы, конечно, должны добавить обработку ошибок (try, catch).

// 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();
0 голосов
/ 11 февраля 2019

Вы должны сделать это по порядку.Сначала добавьте запись в основную таблицу 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()

Ref: Mysql: Как вставить значения в таблицу с внешним ключом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...