2017-08-30 41 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