[英]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列上创建一个唯一索引。
对于这种类型的关系,必须注意以下几点:
不,那是一对多的关系。 您可以将任意数量的薪水行(包括无薪行)链接到单个员工行。
由于薪水很大程度上取决于员工的属性,因此我考虑将其放在员工表本身中(除非您有一些您没有与我们共享的额外知识,这会造成问题)。
有一些方法可以执行一到一个跨越不同的表。
例如,您可以使用触发器来停止重复项,尽管有些人反对触发器,但这仍然不会阻止一对零映射的出现。
另外,您也可以在两个表(指向彼此)中使用带有虚拟行的双向外键,以允许您一次插入一个表中。
这样做的方法是在雇员中插入一行以指向虚拟工资行。
然后插入指向新插入员工的薪水行。
然后更新员工行以使其固定到新插入的薪水行。 当然,所有这些都应作为单个事务发生,以在应用程序级别上保持引用完整性。
为了获得虚拟行,需要在将外键约束添加到架构之前将其插入,否则会遇到麻烦的情况。
是否确实需要该级别的工作尚有待商especially,尤其是当您可以按照建议将数据组合到一个表中以简单地一对一地执行时:-)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.