2017-08-30 2 views
0

私は2つのテーブルを持っています.1つは従業員用で、もう1つは部署用です。部門には複数の従業員を配置することができますが、1人の従業員は1つの部門でのみ働くことができ彼らの関係は[1:たくさん]です。MySQL - 1対多の関係が正しく動作しません

私はこれをMySQLで実行しようとしていますが、問題が発生しました。私は8つのさまざまな部門を持っていると私は別の部署で働く合計で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`)) 

、すべてが素晴らしい作品。 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

従業員のテーブル、挿入が失敗し、私が記述したエラーが発生します:

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に設定されました。このIDは、employees表の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

JOINを通じdepartment_nameを得ることができ、私はDEPARTMENT_IDに、私は部門の挿入に与えた同じIDを与える必要があるでしょうか? –

+0

@ ceid-vgはい、従業員の挿入時に使用されるdepartment_idは、従業員が働く部門の部門テーブルのIDと一致します。従業員に部門名を表示する場合は、2つのテーブルを結合します。私はJacquesと同意します。あなたのコードをより人間が読めるようにするためには、IDはdept_idとemp_idという名前が最も良いということに同意します。 – LAS

1

employeeの外部キーで間違ったフィールドを使用しています。わかりやすくするために、それぞれのidフィールドに異なる名前を付ける必要があります。 dept_idemployee_id次にemployee表は、フィールドがdepartmentに対して検証される(DEPARTMENT_NAMEない)dept_id求めているべきである:

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。

あなたはその後、従業員の挿入で

関連する問題