【问题标题】:MySQL - One to Many Relationship does not work correctlyMySQL - 一对多关系无法正常工作
【发布时间】:2018-02-08 19:21:31
【问题描述】:

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

我正在尝试在 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-INSERT 操作后的样子:

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

【问题讨论】:

    标签: mysql database constraints relationship


    【解决方案1】:

    您在 employee 的外键中使用了错误的字段。为清楚起见,您应该以不同的方式命名每个 id 字段。 dept_idemployee_id 然后employee 表应该有一个名为dept_id(不是部门名称)的字段,它将根据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;

    然后您可以通过 JOIN 获得department_name

    【讨论】:

      【解决方案2】:

      返回部门的外键设置为id,在employees表中为employee_id;它需要引用department_id。我将 department_id 添加到您的员工表中,并将外键引用更改为 department_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)
      

      )ENGINE=INNODB;

      【讨论】:

      • 在员工插入时,我需要为部门插入提供与部门插入中相同的 id 吗?
      • @ceid-vg 是的,插入员工时使用的 department_id 与员工所在部门的部门表中的 ID 匹配。当您想与员工一起显示部门名称时,请连接两个表。我同意 Jacques 的观点,最好将 ID 命名为 dept_id 和 emp_id,以使您的代码更易于阅读。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多