2017-08-30 91 views
0

我有2個表,一個用於員工,另一個用於部門。一個部門可以有多個員工,但一個員工只能在一個部門工作。他們的關係是[1:很多]。MySQL - 一對多關係無法正常工作

我想在MySQL中做到這一點,但我遇到了一個問題。如果我有8個不同的部門,我嘗試添加超過800名員工總數,誰在不同的部門工作,我得到以下錯誤:

Cannot add or update a child row: a foreign key constraint fails (`testdb`.`employee`, CONSTRAINT `employee_ibfk_1` FOREIGN KEY (`id`) REFERENCES `department` (`id`)) 

如果我有8名或更少的員工,一切都很正常。添加第9名員工後,我收到上述錯誤。

部門表:

CREATE TABLE IF NOT EXISTS department(
    id INT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    name VARCHAR(255) NOT NULL UNIQUE 
)ENGINE=INNODB; 

處插入:

INSERT INTO department(name) VALUES ('Athens'); 
INSERT INTO department(name) VALUES ('Patras'); 
INSERT INTO department(name) VALUES ('Kalamata'); 
INSERT INTO department(name) VALUES ('Heraklion'); 
INSERT INTO department(name) VALUES ('Thessaloniki'); 
INSERT INTO department(name) VALUES ('Xanthi'); 
INSERT INTO department(name) VALUES ('Larisa'); 
INSERT INTO department(name) VALUES ('Alexandroupoli'); 

Employee表:

CREATE TABLE IF NOT EXISTS employee(
    id INT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    first_name VARCHAR(255) NOT NULL, 
    last_name VARCHAR(255) NOT NULL, 
    email VARCHAR(255) NOT NULL, 
    born INT(20) NOT NULL, 
    country VARCHAR(255) NOT NULL, 
    department_name VARCHAR(255) NOT NULL, 
    FOREIGN KEY (id) references department(id) 
)ENGINE=INNODB; 

員工插入:

INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('Vaggelis','Michos','[email protected]','1995','Greece','Athens'); 
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('James','Gunn','[email protected]','1970','USA','Athens'); 
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('George','McMahon','[email protected]','1978','Usa','Patras'); 
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('John','Jones','[email protected]','1992','England','Patras'); 
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('Marinos','Kuriakopoulos','[email protected]','1986','Greece','Alexandroupoli'); 
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('Dimitris','Nikolaou','[email protected]','1984','Greece','Larisa'); 
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('Soufiane','El Kaddouri','[email protected]','1974','France','Xanthi'); 
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('Maria','Apostolou','[email protected]','1997','Greece','Larisa'); 
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('Ioannis','Marinou','[email protected]','1982','Greece','Kalamata'); 
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('Thanasis','Athanasiou','[email protected]','1989','Cyprus','Heraklion'); 

這是什麼樣子後CREATE-INSERT操作:

enter image description here

enter image description here

正如你所看到的,在第9插入員工表,插入失敗,我得到我描述的錯誤,這是:

Cannot add or update a child row: a foreign key constraint fails (`testdb`.`employee`, CONSTRAINT `employee_ibfk_1` FOREIGN KEY (`id`) REFERENCES `department` (`id`)) 

回答

2

返回部門的外鍵被設置爲員工表中的id是employee_id;它需要引用department_id。我將department_id添加到您的員工表中,並將外鍵引用更改爲department_id。我刪除了department_name,因爲它是冗餘數據。

CREATE TABLE IF NOT EXISTS employee(
    id INT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    first_name VARCHAR(255) NOT NULL, 
    last_name VARCHAR(255) NOT NULL, 
    email VARCHAR(255) NOT NULL, 
    born INT(20) NOT NULL, 
    country VARCHAR(255) NOT NULL, 
    department_id INT(20) 
    FOREIGN KEY (department_id) references department(id) 

)ENGINE = INNODB;

+0

在員工插入,我需要分給DEPARTMENT_ID我在部門插入了同樣的ID? –

+0

@ ceid-vg是的,插入員工時使用的department_id與員工所在部門的部門表中的ID相匹配。當您想要顯示員工的部門名稱時,請加入這兩個表格。我同意Jacques的說法,這些ID最好命名爲dept_id和emp_id,以使您的代碼更具人類可讀性。 – LAS

1

您在employee的外鍵中使用了錯誤的字段。爲了清楚起見,您應該對每個id字段命名不同。 dept_idemployee_id 然後employee表應該有一個字段稱爲dept_id(未DEPARTMENT_NAME),這將驗證對department

CREATE TABLE IF NOT EXISTS department(
    dept_id INT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    name VARCHAR(255) NOT NULL UNIQUE 
)ENGINE=INNODB; 

CREATE TABLE IF NOT EXISTS employee(
    empl_id INT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    first_name VARCHAR(255) NOT NULL, 
    last_name VARCHAR(255) NOT NULL, 
    email VARCHAR(255) NOT NULL, 
    born INT(20) NOT NULL, 
    country VARCHAR(255) NOT NULL, 
    dept_id INT(20) NOT NULL, 
    FOREIGN KEY (dept_id) references department(dept_id) 

)ENGINE = INNODB;

然後,您可以得到department_name通過JOIN