如果将最小基数从0改为1,就需要将外键设置为not null,这时需要确保目前存在的数据外键都为not null,否则我们需要先更新数据。根据不同的DBMS产品,修改外键的方式也不一样,但是可以遵循下面的步骤:
1) 删除旧的外键约束;
2) 设置外键列为not null;
3) 添加新的外键约束。
上面的例子修改最小基数的SQL语句如下:
ALTER TABLE EMPLOYEE
DROP CONSTRAINT DepartmentFK;
ALTER TABLE EMPLOYEE
ALTER COLUMN DepartmentNumber Int NOT NULL;
ALTER TABLE EMPLOYEE
ADD CONSTRAINT DepartmentFK FOREIGN KEY (DepartmentNumber)
REFERENCES DEPARTMENT (DepartmentNumber)
ON UPDATE CASCADE;
级联属性需要根据具体的业务来确定。
child端
在child端设置最小基数非零需要利用触发器或者application code,因而将最小基数从零变为一也需要利用触发器。如果将最小基数从1变为0,直接删除触发器即可。
6.2 增大最大基数
1:1 to 1:N
假设在EMPLOYEE 和PARKING_PERMIT之间存在如图三所示的1:1关系,现在默认employee是parent,因为外键在parking_permit中。当将1:1的关系变为1:N的关系时,需要考虑哪端是parent端(为1)。假如employee还是parent端,则只需要将parking_permit中的外键unique属性去掉即可。如果parking_permit变为parent端,则我们需要将外键移到employee中,还需要数据导入employee表中。具体的操作如下:
1) 在employee中添加可以为null的外键PermitNumber;
UPDATE EMPLOYEE
SET EMPLOYEE.PermitNumber =
(SELECT PP.PermitNumber
FROM PARKING_PERMIT AS PP
WHERE PP.EmployeeNumber = EMPLOYEE.EmployeeNumber);
3) 将parking_permit中的外键EmployeeNumber删除;
4) 在employee中添加外键约束;
5) 修改相应的触发器和视图。
1:N to N:M
将1:N的关系变为N:M的关系比较容易,只需要:创建一个只包含两个表主键的新表(intersection table),然后将两个主键的组合作为新表的主键,每一个分别是依赖于另外每一个表的外键;从child表导入数据,然后删除child中的外键约束。最后修改触发器和视图使其应用新表。
6.3 减小最大基数(存在数据丢失)
将一个N:M的关系降为一个1:N的关系,我们需要在child表中添加一个外键,然后从intersection table中导入外键的数据。修改相应的触发器和视图等,最后将intersection table删除。将一个1:N的关系降为1:1的关系,我们需要将child表中的外键数据变为1,然后将外键约束变为unique。这两种情况都需要决定如何删除数据。