繁体   English   中英

在MySQL中建立一对一关系

[英]Create one to one relationship in MySQL

这是在MySQL以一对一关系的方式链接两个表的正确代码吗?

Table1

CREATE TABLE employees (id INT PRIMARY KEY AUTO_INCREMENT,FullName VARCHAR(50))

Table2

CREATE TABLE salary (id INT PRIMARY KEY AUTO_INCREMENT,SalaryNumber VARCHAR(6))

ALTER TABLE salary
ADD FOREIGN KEY (id) REFERENCES employees (id)
ON DELETE CASCADE
ON UPDATE CASCADE

您的示例有很多问题,首先是要链接两个不相关的自动递增ID。 这是一场噩梦,等待发生。 如果发生任何事情使这两个ID不同步,那么您就死定了。

在您的示例中,“雇员”记录将被视为“工资”记录所依赖的父记录(即-您可能有没有相应薪水记录的雇员记录,但您不希望有与员工无关)。

如MySql文档中所述,外键约束属于子表。 因此,您在“薪水”表中需要的是一个看起来像这样的列:

EmployeeId INT非空

您的外键是

更改表工资添加外键(EmployeeId)参考雇员(id)删除级联更新级联

此时,您仍然具有多对一关系,因为没有什么可以阻止您使用相同的EmployeeId将多个条目插入到薪水表中。

要使这种关系一对一,必须在salary.EmployeeId列上创建一个唯一索引。

对于这种类型的关系,必须注意以下几点:

  1. 您将无法在没有有效EmployeeId的工资行中插入行
  2. 您将无法在薪水中插入具有重复EmployeeId的行
  3. 当您删除工资记录时,员工记录保持不变。
  4. 删除员工记录将导致其引用的薪水记录被删除(如果您不希望这种行为,请将ON DELETE CASCADE更改为其他内容)
  5. 在薪水表为空并删除之前,您不能删除employee表。

不,那是一对多的关系。 您可以将任意数量的薪水行(包括无薪行)链接到单个员工行。

由于薪水很大程度上取决于员工的属性,因此我考虑将其放在员工表本身中(除非您有一些您没有与我们共享的额外知识,这会造成问题)。


一些方法可以执行一到一个跨越不同的表。

例如,您可以使用触发器来停止重复项,尽管有些人反对触发器,但这仍然不会阻止一对零映射的出现。

另外,您也可以在两个表(指向彼此)中使用带有虚拟行的双向外键,以允许您一次插入一个表中。

这样做的方法是在雇员中插入一行以指向虚拟工资行。

然后插入指向新插入员工的薪水行。

然后更新员工行以使其固定到新插入的薪水行。 当然,所有这些都应作为单个事务发生,以在应用程序级别上保持引用完整性。

为了获得虚拟行,需要将外键约束添加到架构之前将其插入,否则会遇到麻烦的情况。

是否确实需要该级别的工作尚有待商especially,尤其是当您可以按照建议将数据组合到一个表中以简单地一对一地执行时:-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM