在级联更新的情况下,如果数据库中有外键约束,则根本无法在应用程序空间中执行此操作。
示例:假设您有一个美国各州的查找表,其主键是两个字母的缩写。然后您就有一个引用它的邮寄地址表。有人告诉您,您错误地将蒙大拿州的缩写“MO”而不是“MT”,因此您需要在查找表中更改它。
CREATE TABLE States (st CHAR(2) PRIMARY KEY, state VARCHAR(20) NOT NULL);
INSERT INTO States VALUES ('MO', 'Montana');
CREATE TABLE Addresses (addr VARCHAR(20), city VARCHAR(20), st CHAR(2), zip CHAR(6),
FOREIGN KEY (st) REFERENCES States(st));
INSERT INTO Addresses VALUES ('1301 East Sixth Ave.', 'Helena', 'MO', '59620');
Run Code Online (Sandbox Code Playgroud)
现在您可以修复错误,无需数据库端级联更新的帮助。下面是使用 MySQL 5.0 的测试(假设密苏里州不存在记录,它实际上使用缩写“MO”)。
UPDATE States SET st = 'MT' WHERE st = 'MO';
ERROR 1451 (23000): Cannot delete or update a parent row:
a foreign key constraint fails (`test/addresses`,
CONSTRAINT `addresses_ibfk_1` FOREIGN KEY (`st`) REFERENCES `states` (`st`))
UPDATE Addresses SET st = 'MT' WHERE st = 'MO';
ERROR 1452 (23000): Cannot add or update a child row:
a foreign key constraint fails (`test/addresses`,
CONSTRAINT `addresses_ibfk_1` FOREIGN KEY (`st`) REFERENCES `states` (`st`))
UPDATE Addresses JOIN States USING (st)
SET Addresses.st = 'MT', States.st = 'MT'
WHERE States.st = 'MO';
ERROR 1451 (23000): Cannot delete or update a parent row:
a foreign key constraint fails (`test/addresses`,
CONSTRAINT `addresses_ibfk_1` FOREIGN KEY (`st`) REFERENCES `states` (`st`))
Run Code Online (Sandbox Code Playgroud)
没有应用程序端查询可以解决这种情况。您需要在数据库中进行级联更新,以便在强制执行引用完整性约束之前以原子方式在两个表中执行更新。