【问题标题】:MySQL 1-many relationship issueMySQL 1-many 关系问题
【发布时间】:2017-09-02 12:21:56
【问题描述】:

我有 2 张表,一张用于员工,一张用于部门。一名员工只能在一个部门工作,但一个部门可以有多名员工。我在它们之间添加了一个外键约束,但是如果我尝试将具有相同数据的相同员工添加到同一部门,则查询将执行而不是失败。

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');

第二次插入 Employee 'Mark' 后,我期待一个错误,但查询总是执行。如何限制一名特定员工只能在一个部门工作?

【问题讨论】:

  • mysql 还是 sql-server?
  • MySQL,抱歉打错标签
  • 为什么会出现错误?
  • 小心!!如果您有 2 个同名员工会怎样?!?! 发生了

标签: mysql foreign-keys


【解决方案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

已编辑

查询

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

【讨论】:

  • 如果您有 2 名同名员工会怎样。
  • @RiggsFolly 好吧,我认为主题启动器应该在表中添加姓氏列...更有意义,因为两个同名员工可以添加同一个部门
  • 我只能说John SmithZhang Wei
【解决方案2】:

发生这种情况是因为名称列上没有约束。

添加唯一约束 Employee.name 。

例如

ALTER TABLE Employee
ADD CONSTRAINT UC_Person UNIQUE (name)

; ,

【讨论】:

  • 那么如果你有 2 名同名的员工会怎样?三思而后行
  • 在这种情况下,这个问题是无效的,你必须创建repeater员工表,应该为关系建立trans表
  • @RiggsFoll 这个问题在这种情况下无效。我们需要创建桥接表并在该标签中包含 pk s..
猜你喜欢
  • 1970-01-01
  • 2012-03-16
  • 2011-01-30
  • 1970-01-01
  • 1970-01-01
  • 2016-04-12
  • 2016-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多