2017-09-02 107 views
0

我有2個表,一個用於員工,一個用於部門。一個員工只能在一個部門工作,但一個部門可以有多個員工。我在它們之間添加了一個外鍵約束,但是如果我嘗試將相同的數據添加到同一個部門,那麼查詢將執行而不是失敗。MySQL一對多關係問題

create table Department(id int primary key auto_increment, name varchar(100)); 

create table Employee(id int primary key auto_increment, 
       department_id int not null, 
       name varchar(100), 
       foreign key (department_id) references department(id)); 

INSERT INTO Department(name) VALUES('China'); 
INSERT INTO Department(name) VALUES('England'); 

INSERT INTO Employee(department_id,name) VALUES (1,'Mark'); 
INSERT INTO Employee(department_id,name) VALUES (1,'Mark'); 

第二次插入員工'標記'後,我期待着一個錯誤,但是總是執行查詢。我如何限制一個特定員工只能工作到一個部門?

+0

MySQL或SQL服務器? –

+0

MySQL,對不起,錯了標籤 –

+0

你爲什麼期待一個錯誤? – RiggsFolly

回答

1

您需要唯一索引(department_id,name)。

這仍然允許其他部門中的名稱標記。

ALTER TABLE `employee` ADD UNIQUE INDEX `unique_department_id__name` (`department_id`, `name`); 

查詢

INSERT INTO Employee(department_id,NAME) VALUES (1,'Mark'); 
INSERT INTO Employee(department_id,NAME) VALUES (1,'Mark'); 

結果

Query: INSERT INTO Employee(department_id,name) VALUES (1,'Mark') 

1 row(s) affected 

Execution Time : 0.013 sec 
Transfer Time : 0 sec 
Total Time  : 0.014 sec 
----------------------------------------------------------- 

Query: INSERT INTO Employee(department_id,name) VALUES (1,'Mark') 

Error Code: 1062 
Duplicate entry '1-Mark' for key 'unique_department_id__name' 

Execution Time : 0 sec 
Transfer Time : 0 sec 
Total Time  : 0.003 sec 

EDITED

曲ERY

INSERT INTO Employee(department_id,NAME) VALUES (2,'Mark'); 

結果

Query: INSERT INTO Employee(department_id,NAME) VALUES (2,'Mark') 

1 row(s) affected 

Execution Time : 0.021 sec 
Transfer Time : 0 sec 
Total Time  : 0.022 sec 
+1

如果您有兩名具有相同名稱的員工,會發生什麼情況。 – RiggsFolly

+0

@RiggsFolly我認爲主題首發應該在表中添加一個姓氏列...更有意義,因爲兩個同名的員工可以工作添加相同的部門 –

+1

我只能說這是'約翰史密斯'或'張偉 – RiggsFolly

1

發生這種情況是因爲名稱列上沒有限制。

添加唯一約束Employee.name。

例如

ALTER TABLE Employee 
ADD CONSTRAINT UC_Person UNIQUE (name) 

; ,

+1

那麼如果你有兩個同名的員工會發生什麼?在你跳 – RiggsFolly

+0

之前想想這種情況下這個問題是無效的,你必須創建中繼器員工表,那裏應該有關於轉運表的關係 –

+0

@RiggsFoll這個問題在這種情況下是無效的。我們需要創建橋接表並在該標籤中包含pk .. –