上面是我简单的数据库设计,只是想获取有关事情发生的信息,因为我是数据库的新手。以下是我的问题:
当我更新wall表中的wall_id时,wall_categories表中的wall_id是否也会更新?作为wall_id wall_categories表引用wall表中的wall_id。
与wall表中的desktop_id相同,因为它是引用desktop_wall表中的desktop_id的外键,所以当我更新时 wall table中的desktop_id也是deskotp_wall中的desktop_id 得到更新?
如果默认情况下没有更新,怎么办呢?
非常感谢!
答案 0 :(得分:3)
此功能称为级联参照完整性。定义外键约束时,它是可选的。此处描述了启用它的语法(Micorosoft SQL,但语法是标准的,大多数DBMS都支持它):
http://technet.microsoft.com/en-us/library/ms186973(v=sql.105).aspx
答案 1 :(得分:2)
不会自动更新外键。您需要更新自己引用它的表中的外键,否则会导致引用完整性异常。
要自动更新外键,您可以使用 TRIGGERS 。
修改: - 强>
正如sqlvogel在评论中所建议的,如果你的DBMS支持级联更新,你就不需要为此创建TRIGGERS。
在这种情况下,如果你有Cascading Referential Integrity Constraints
会更好通过使用级联参照完整性约束,您可以定义 SQL Server在用户尝试删除时执行的操作 更新现有外键指向的键。
答案 2 :(得分:2)
当我在wall table中更新wall_id时,wall_categories表中的wall_id是否也会更新?因为wall_categories表中的wall_id引用了wall表中的wall_id。
- 醇>
与wall table中的desktop_id相同,因为它是一个引用desktop_wall表中的desktop_id的外键,所以当我在wall table中更新desktop_id时,deskotp_wall中的desktop_id是否也会更新?
不,更新不会自动发生。实际上,您会得到SQLException
,因为您试图破坏参照完整性,因此您的更新将失败。假设您已将有效Constraints
应用于表格。
ON UPDATE CASCADE
,但所有数据库都支持 。虽然,显然应该优先考虑级联更新;如果您的数据库不支持它,您需要实现后行 Trigger
。
例如,在Oracle
中,您可以将其实现为:
CREATE OR REPLACE TRIGGER walls_wall_upd_trg
AFTER UPDATE OF wall_id ON walls FOR EACH ROW
BEGIN
UPDATE wall_categories
SET wall_id = :new.wall_id
WHERE wall_id = :old.wall_id;
UPDATE wall_comments
SET wall_id = :new.wall_id
WHERE wall_id = :old.wall_id;
END;
CREATE OR REPLACE TRIGGER walls_desk_upd_trg
AFTER UPDATE OF desktop_id ON walls FOR EACH ROW
BEGIN
UPDATE desktop_wall
SET desktop_id = :new.desktop_id
WHERE desktop_id = :old.desktop_id;
END;
答案 3 :(得分:2)
在postgresql中,我这样写
ALTER TABLE a_table
ADD CONSTRAINT fk_a_b FOREIGN KEY (a_id)
REFERENCES b_table (b_some_id)
ON DELETE CASCADE ON UPDATE CASCADE;
并以级联方式更新和删除字段。
答案 4 :(得分:0)
没有。它不会自动更新。什么是数据库?你是什么?