2011-12-09 96 views
0

我與用戶界面的工作,其中用戶會點擊Add按鈕添加的員工,但是當我做它,它給了我這樣的我插入INTO語句不工作

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`finalpayroll`.`personal_info`, CONSTRAINT `personal_info_ibfk_1` 

錯誤我會怎樣解決這個問題??我知道我使用的是父鍵,而其外鍵是用戶,並且還要注意父鍵已經有數據,但看起來我的查詢不起作用,爲什麼?我正在使用具有刪除級聯和更新級聯的外鍵,以便在刪除數據時,所有子錶行都將被刪除,反之亦然。這是我爲添加或插入語句

public void addEmployee(Personal p ,Contact c,Employee e) { 
    Connection conn = Jdbc.dbConn(); 
    Statement statement = null; 
    String insert1 = "INSERT INTO personal_info (`First_Name`, `Middle_Initial`, `Last_Name`, `Date_Of_Birth`, `Marital_Status`, `Beneficiaries`) VALUES ('"+p.getFirstName()+"', '"+p.getMiddleInitial()+"'" + 
       "  , '"+p.getLastName()+"', '"+p.getDateOfBirth()+"', '"+p.getMaritalStatus()+"', '"+p.getBeneficiaries()+"')"; 
    try { 
     statement = conn.createStatement(); 
     statement.executeUpdate(insert1); 
     statement.close(); 
     conn.close(); 
     JOptionPane.showMessageDialog(null, "Employee Added!!"); 
    } catch(Exception ex) { 
     ex.printStackTrace(); 
    } 
} 

用戶表項:

CREATE TABLE `users` (
    `idusers` int(11) NOT NULL AUTO_INCREMENT, 
    `emp_id` varchar(45) DEFAULT NULL, 
    `emp_pass` varchar(45) DEFAULT NULL, 
    PRIMARY KEY (`idusers`) 
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1 

的personal_info表:

CREATE TABLE `personal_info` (
    `idpersonal_info` int(11) NOT NULL AUTO_INCREMENT, 
    `First_Name` varchar(45) DEFAULT NULL, 
    `Middle_Initial` varchar(45) DEFAULT NULL, 
    `Last_Name` varchar(45) DEFAULT NULL, 
    `Date_Of_Birth` varchar(45) DEFAULT NULL, 
    `Marital_Status` varchar(45) DEFAULT NULL, 
    `Beneficiaries` varchar(45) DEFAULT NULL, 
    PRIMARY KEY (`idpersonal_info`), 
    CONSTRAINT `personal_info_ibfk_1` 
    FOREIGN KEY (`idpersonal_info`) 
    REFERENCES `users` (`idusers`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 
+0

你可以分享表創建語句爲用戶和personal_info? personal_info表中的哪個字段涉及用戶表?你沒有在你的查詢中設置任何類似id的字段.. – melihcelik

+0

它說違反了personal_info_ibfk_1。你看過那個限制嗎? – Paparazzi

+0

如果您可以將架構發佈到表中,那將會很好。它會讓人們給你更準確的建議。 –

回答

2

您試圖插入一條記錄,與6個領域:First_NameMiddle_InitialLast_NameDate_Of_BirthMarital_StatusBeneficiaries。您的模式目前是未知的,但這些字段中沒有一個似乎是您提到的User表的id的候選外鍵。因此,我認爲該外鍵列有一個默認值,並且該用戶表中缺少該缺省值。

不用說,你不應該有任何表的外鍵的默認值..

我加入關於您的問題的意見和更新你的問題這些信息:

一外鍵分別是您的案例中子表和personal_infousers表之間的鏈接。子表的外鍵列必須引用父表中的鍵值,這意味着對於子表的FK列中的每個值,父表的鏈接列中必須有一個值。

現在,在您的情況下,當您嘗試插入新的personal_info記錄時,MySQL會爲其指定一個idpersonal_info,因爲您將其定義爲自動增量。但是由於有一個鏈接到用戶表,因此MySQL會搜索新的idpersonal_info以插入用戶表的idusers列中。而當你得到這個例外時,你在用戶表中肯定沒有這個值。

你可以改變你的表結構如下:

CREATE TABLE `personal_info` (
    `idpersonal_info` int(11) NOT NULL AUTO_INCREMENT, 
    `user_id` int(11) NOT NULL, 

    ... OTHER FIELD DEFINITIONS, 

    PRIMARY KEY (`idpersonal_info`), 
    CONSTRAINT `user_id_fk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`idusers`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB 

和您的查詢將需要包括user_id領域也是如此。所以它會是這樣的:

INSERT INTO personal_info 
    (`user_id`, `First_Name`, `Middle_Initial`, `Last_Name`, `Date_Of_Birth`, `Marital_Status`, `Beneficiaries`) 
VALUES (.... SET YOUR VALUES HERE. DON'T FORGET TO SET A VALID USER_ID 
+0

但我想,我設置自動增量表? ,所以我想我不需要在這裏插入主鍵,或者主要ID在這裏 – KyelJmD

+0

我在想,如果我將這些值插入到這個表中,它將會有一個自動化的值,因爲我將它設置爲一個自動增量,並且我的用戶表上有條目 – KyelJmD

+1

你可以運行'show create table user'和'show create table personal_info'並將兩個查詢的輸出作爲編輯添加到你的問題中嗎? – melihcelik

0

看起來像你的personal_info表已被稱爲 「finalpayroll」 一欄,指向另一個表(外鍵)中的列,並且它是必需的(不可爲空)。在你插入你沒有給它一個價值。所以你可以做的是使該列可以爲空。

或者可能是周圍的其他方法如@Konstantin納雷什金是說

+0

但是這個表有一個自動增量,我認爲它會做這個工作 – KyelJmD

0

什麼錯誤的意思是,你正試圖插入值的列與外鍵的值,它是不是在遠程表。

我假設有一個用戶列,我們沒有看到。由於您沒有明確設置該值,因此我認爲它正在獲取默認值。默認值不在父表中。

+0

但是,它是在自動增量,我認爲它會自動將其值設置爲1或取決於最後一個值? – KyelJmD