Как автоматически вставлять ссылки внешнего ключа в таблицы в mysql или JDBC?

Я использую MySQL. Мой вопрос заключается в том, как автоматически вставлять вновь добавленную строку в таблицу внешнего ключа. Пример пояснит мой вопрос:

У меня есть две таблицы Employee and Salary:

CREATE TABLE Employee(
     emp_id int NOT NULL AUTO_INCREMENT,
     name char(30),
     PRIMARY KEY (emp_id)
)  ENGINE=innoDB;

CREATE TABLE salary {
       sal_id int NOT NULL AUTO_INCREMENT
       salary_figure int,
       emp_id int,
       PRIMARY KEY (sal_id),
       FOREIGN KEY REFERENCES Employee(emp_id)
}

Вот таблица соединений:

employee_salary_join Table {
    int sal_id,
    int emp_id
}

В приведенной выше таблице соединений нет отношения внешнего ключа.

Теперь, когда я вставляю сотрудника в таблицу employee

INSERT into Employee values ("john")

После выполнения этого оператора строка создается в таблице Employee, которая имеет pk, назначенный механизмом базы данных.

Теперь, когда я вставляю строку для сотрудника Джона в таблицу зарплат, как показано ниже:

INSERT into SALARY values ("30000", ?????)

Как мне получить идентификатор сотрудника только что вставленной строки для Джона выше и поместить его здесь вместо ?????

Наконец, у меня есть таблица соединений, где каждый раз, когда строка добавляется в таблицу зарплат, мне нужна соответствующая запись в таблице соединений. Это может быть сделано с помощью триггеров, но я не совсем понимаю, как настроить его, потому что мне нужны ссылки как emp_id, так и sal_id для строки таблицы соединений.

Я также хотел бы узнать лучшие практики здесь, когда занимаюсь вставками внешнего ключа. Я использую драйвер JDBC/mysql. Я предполагаю, что это не должно влиять на то, как мы обрабатываем выше в sql-операторах.

Ответы

Ответ 1

Вы получаете этот идентификатор столбца auto_increment для вставленной строки с функцией LAST_INSERT_ID: Таким образом, вы можете использовать

INSERT into SALARY (salary_figure, emp_id) values ("30000", LAST_INSERT_ID());

для вашей второй операции INSERT.

Если вы хотите добавить строку триггером в третью таблицу, используя новые значения sal_id и emp_id, вы можете сделать это с помощью триггера AFTER INSERT в таблице Salary, используя новое значение в столбец emp_id и последний вставленный идентификатор auto_increment... с уже упомянутой функцией LAST_INSERT_ID().

CREATE TRIGGER salary_after_insert AFTER INSERT ON `SALARY` 
    FOR EACH ROW
    BEGIN
         INSERT INTO join_table (emp_id, sal_id) VALUES (NEW.emp_id, LAST_INSERT_ID());
    END;

Ответ 2

Я использую этот код и правильно его работаю

 try 
        { 
        SqlCommand comm = new SqlCommand("Insert into tbl_sale(Terminal_NO, Date, Sale_Type, Fuel_Type, Unit) values('"+ddl_terminal.SelectedItem+"','"+dt_sales.Value.Date+"', '"+ddl_SaleType.SelectedItem+"', '"+ddl_FuelType.SelectedItem+"', '"+ddl_unit.SelectedItem+"')",conn);
SqlCommand com = new SqlCommand("Insert into tbl_saleDetails(Sale_ID, Unit_Sold, Amount_per_Liter) values((Select Sale_ID from tbl_sale where Sale_ID = (Select MAX(Sale_ID) from tbl_sale)),'" + txt_Cash_Unit_Sold.Text + "','" + txt_Cash_Amount_per_liter.Text + "')", conn);
        conn.Open();
        comm.ExecuteNonQuery();
        com.ExecuteNonQuery();
        conn.Close();
            MessageBox.Show("Data Saved Successfully!");
            }
        catch(Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }