5

简单的数据库设计

以上是我的简单数据库设计,只是想了解事情是如何发生的,因为我对数据库真的很陌生。以下是我的问题:

  1. 当我更新墙壁表中的 wall_id 时,wall_categories 表中的 wall_id 是否也会更新?作为 wall_categories 表中的 wall_id 引用墙壁表中的 wall_id。

  2. 与 wall 表中的 desktop_id 相同,因为它是引用 desktop_wall 表中的 desktop_id 的外键,所以当我更新 wall 表中的 desktop_id 时,deskotp_wall 中的 desktop_id 是否也会更新?

  3. 如果默认不更新,怎么办?

非常感谢!

4

4 回答 4

4

此功能称为级联参照完整性。当您定义外键约束时,它是可选的。此处描述了启用它的语法(Micorosoft SQL,但语法是标准的,并且大多数 DBMS 都支持它):

http://technet.microsoft.com/en-us/library/ms186973(v=sql.105).aspx

于 2013-10-26T17:38:37.620 回答
3

在 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;

并以级联方式更新和删除文件。

于 2013-10-26T17:34:34.723 回答
2

不,外键不会自动更新。您需要更新自己引用的表中的外键,否则会导致引用完整性异常。

要自动更新外键,您可以使用TRIGGERS

编辑:-

正如 sqlvogel 在评论中所建议的,如果您的 DBMS 支持级联更新,则您不需要为此创建 TRIGGERS。

在这种情况下,如果您有级联参照完整性约束会更好

通过使用级联参照完整性约束,您可以定义当用户尝试删除或更新现有外键指向的键时 SQL Server 执行的操作。

于 2013-10-26T17:28:15.970 回答
2
  1. 当我更新walls 表中的wall_id 时,wall_categories 表中的wall_id 是否也会更新?作为 wall_categories 表中的 wall_id 引用墙壁表中的 wall_id。

  2. 与 wall 表中的 desktop_id 相同,因为它是引用 desktop_wall 表中的 desktop_id 的外键,所以当我更新 wall 表中的 desktop_id 时,deskotp_wall 中的 desktop_id 是否也会更新?

不,更新不会自动发生。事实上,你会得到一个SQLException,因为你试图破坏参照完整性,因此你的更新会失败。这假设您已有效Constraints地应用于表格。


也有,ON UPDATE CASCADE并非所有数据库都支持。虽然,级联更新显然应该是首选;如果您的数据库不支持它,则需要实现after-row 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;
于 2013-10-26T17:29:51.673 回答