2014-09-18 98 views
4

我正在使用MySQL。我的問題是如何自動將新添加的行插入到外鍵表中。下面舉例說明我的問題:如何在MySQL或JDBC表中自動插入外鍵引用?

我有兩個表僱員和工資待遇:

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 
} 

連接表上面沒有任何外鍵關係。

現在,當我插入一個員工到員工表

INSERT into Employee values ("john") 

執行該語句之後,在具有由數據庫引擎分配PK Employee表創建一個行。

現在,當我在工資表如下插入員工約翰列:

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

如何獲取剛插入行的員工ID爲約翰以上,並把它在這裏的?????

的地方

最後,我有一個連接表,其中每次在工資表中添加一行時,我都希望連接表中的相應條目。這可以通過觸發器完成,但我不完全清楚如何設置它,因爲我需要連接錶行的引用emp_idsal_id

我也想知道在處理外鍵插入時的最佳實踐。我正在使用JDBC/MySQL驅動程序。我想這應該不會影響我們上面在sql語句中的過程。

+0

可能重複【如何獲得JDBC插入ID?](http://stackoverflow.com/questions/1915166/how- jdbc) – 2014-09-18 19:15:01

+0

@MarkRotteveel:該鏈接有助於澄清第一部分。關於獲取連接表的ids的第二部分,在JDBC中有沒有辦法自動插入。或者在數據庫結束時需要觸發器。如果是這樣,要觸發器工作,需要知道這兩個表中的兩行的編號 – 2014-09-18 19:22:06

+0

這是您應該堅持SO的一個具體問題的原因之一。但是,MySQL具有觸發器,您可以從插入的記錄中獲取值以插入到另一個表中,請參閱http://dev.mysql.com/doc/refman/5.7/en/trigger-syntax.html(末尾的具體示例) – 2014-09-18 19:33:55

回答

6

你得到你的AUTO_INCREMENT列的這個ID與功能LAST_INSERT_ID的插排: 所以你可以使用

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

你的第二個INSERT操作。

如果你想通過觸發器來添加行到第三個表,使用新的sal_idemp_id值,可以在列EMP_ID和使用新的價值做有後的Salary表的INSERT觸發器最後插入auto_increment id ...與已經提到的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; 
+0

'LAST_INSERT_ID()'如何從employee表中獲取最後插入的鍵。你不指定表名。我想我的問題是不同的。請再讀一遍。它必須處理外鍵引用 – 2014-09-18 19:13:46

+2

@brainstorm簡單地說:'LAST_INSERT_ID()'返回會話中最後生成的id。所以如果這個'INSERT'生成一個id,那麼這個id將被返回(假設你不在其間執行其他插入)。然而,它不是獲得生成密鑰的'JDBC'方式,請參閱http://stackoverflow.com/questions/1915166/how-to-get-the-insert-id-in-jdbc/1915197 – 2014-09-18 19:15:54

+0

@MarkRotteveel你'關於「JDBC」方式絕對正確,因爲這樣的API將抽象化DBMS功能,因此它可以與任何數據庫管理系統一起使用。在沒有任何Java代碼的情況下,我編寫了SQL方法... – VMai 2014-09-18 19:22:41

0

我用這個代碼和它的正常工作

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