Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL-一对多关系无法正常工作_Mysql_Database_Constraints_Relationship - Fatal编程技术网

MySQL-一对多关系无法正常工作

MySQL-一对多关系无法正常工作,mysql,database,constraints,relationship,Mysql,Database,Constraints,Relationship,我有两张桌子,一张给员工,另一张给部门。一个部门可以有多个员工,但一个员工只能在一个部门工作。他们的关系是[1:多] 我试图在MySQL中实现这一点,但我遇到了一个问题。如果我有8个不同的部门,并且我尝试添加总共超过8名在不同部门工作的员工,我会得到以下错误: Cannot add or update a child row: a foreign key constraint fails (`testdb`.`employee`, CONSTRAINT `employee_ibfk_1` FOR

我有两张桌子,一张给员工,另一张给部门。一个部门可以有多个员工,但一个员工只能在一个部门工作。他们的关系是[1:多]

我试图在MySQL中实现这一点,但我遇到了一个问题。如果我有8个不同的部门,并且我尝试添加总共超过8名在不同部门工作的员工,我会得到以下错误:

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');
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','vagg7@gmail.com','1995','Greece','Athens');
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('James','Gunn','james8@gmail.com','1970','USA','Athens');
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('George','McMahon','george95@gmail.com','1978','Usa','Patras');
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('John','Jones','john13@gmail.com','1992','England','Patras');
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('Marinos','Kuriakopoulos','marin_kur@gmail.com','1986','Greece','Alexandroupoli');
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('Dimitris','Nikolaou','dimitis8@yahoo.gr','1984','Greece','Larisa');
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('Soufiane','El Kaddouri','sofiane@yahoo.com','1974','France','Xanthi');
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('Maria','Apostolou','mariamaria1@gmail.com','1997','Greece','Larisa');
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('Ioannis','Marinou','ioannis_ap@yahoo.gr','1982','Greece','Kalamata');
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('Thanasis','Athanasiou','thanos89@gmail.com','1989','Cyprus','Heraklion');
部门插页:

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');
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','vagg7@gmail.com','1995','Greece','Athens');
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('James','Gunn','james8@gmail.com','1970','USA','Athens');
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('George','McMahon','george95@gmail.com','1978','Usa','Patras');
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('John','Jones','john13@gmail.com','1992','England','Patras');
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('Marinos','Kuriakopoulos','marin_kur@gmail.com','1986','Greece','Alexandroupoli');
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('Dimitris','Nikolaou','dimitis8@yahoo.gr','1984','Greece','Larisa');
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('Soufiane','El Kaddouri','sofiane@yahoo.com','1974','France','Xanthi');
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('Maria','Apostolou','mariamaria1@gmail.com','1997','Greece','Larisa');
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('Ioannis','Marinou','ioannis_ap@yahoo.gr','1982','Greece','Kalamata');
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('Thanasis','Athanasiou','thanos89@gmail.com','1989','Cyprus','Heraklion');
员工表:

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');
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','vagg7@gmail.com','1995','Greece','Athens');
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('James','Gunn','james8@gmail.com','1970','USA','Athens');
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('George','McMahon','george95@gmail.com','1978','Usa','Patras');
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('John','Jones','john13@gmail.com','1992','England','Patras');
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('Marinos','Kuriakopoulos','marin_kur@gmail.com','1986','Greece','Alexandroupoli');
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('Dimitris','Nikolaou','dimitis8@yahoo.gr','1984','Greece','Larisa');
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('Soufiane','El Kaddouri','sofiane@yahoo.com','1974','France','Xanthi');
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('Maria','Apostolou','mariamaria1@gmail.com','1997','Greece','Larisa');
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('Ioannis','Marinou','ioannis_ap@yahoo.gr','1982','Greece','Kalamata');
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('Thanasis','Athanasiou','thanos89@gmail.com','1989','Cyprus','Heraklion');
员工插页:

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');
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','vagg7@gmail.com','1995','Greece','Athens');
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('James','Gunn','james8@gmail.com','1970','USA','Athens');
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('George','McMahon','george95@gmail.com','1978','Usa','Patras');
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('John','Jones','john13@gmail.com','1992','England','Patras');
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('Marinos','Kuriakopoulos','marin_kur@gmail.com','1986','Greece','Alexandroupoli');
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('Dimitris','Nikolaou','dimitis8@yahoo.gr','1984','Greece','Larisa');
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('Soufiane','El Kaddouri','sofiane@yahoo.com','1974','France','Xanthi');
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('Maria','Apostolou','mariamaria1@gmail.com','1997','Greece','Larisa');
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('Ioannis','Marinou','ioannis_ap@yahoo.gr','1982','Greece','Kalamata');
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('Thanasis','Athanasiou','thanos89@gmail.com','1989','Cyprus','Heraklion');
这是创建-插入操作后的外观:

如您所见,在Employees表的第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`))

将返回到部门的外键设置为id,该id在employees表中为员工id;它需要引用部门id。我将部门id添加到员工表中,并将外键引用更改为部门id。我删除了部门名称,因为它将是冗余数据

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)

)引擎=INNODB

返回到部门的外键被设置为id,该id在employees表中是员工id;它需要引用部门id。我将部门id添加到员工表中,并将外键引用更改为部门id。我删除了部门名称,因为它将是冗余数据

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)

)引擎=INNODB

您在员工的外键中使用了错误的字段。为清晰起见,您应该对每个
id
字段进行不同的命名。
部门id
员工id
然后,
employee
表应该有一个名为
depart\u id
(不是department\u 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)
)引擎=INNODB


然后,您可以通过连接获取部门名称,如果您在员工的外键中使用了错误的字段。为清晰起见,您应该对每个
id
字段进行不同的命名。
部门id
员工id
然后,
employee
表应该有一个名为
depart\u id
(不是department\u 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)
)引擎=INNODB


然后,您可以通过在employee insertions中的联接

获取部门名称,我需要将我在department insertions中提供的id与部门id相同?@ceid vg是的,插入员工时使用的部门id与员工所在部门的department表中的id匹配。如果要显示员工所在的部门名称,请连接两个表。我同意Jacques的观点,最好将id命名为dept_id和emp_id,以使您的代码更具可读性。在员工插入时,我需要向部门id提供与我在部门插入中提供的id相同的id?@ceid vg Yes,插入员工时使用的部门id与员工所在部门的部门表中的id匹配。如果要显示员工所在的部门名称,请连接两个表。我同意Jacques的观点,最好将id命名为dept_id和emp_id,以使代码更具可读性。