主表更新后,外键是否会自动更新?

时间:2013-10-26 17:24:22

标签: sql-server database foreign-keys primary-key rdms

Simple Database Design

上面是我简单的数据库设计,只是想获取有关事情发生的信息,因为我是数据库的新手。以下是我的问题:

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

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

  3. 如果默认情况下没有更新,怎么办呢?

  4. 非常感谢!

5 个答案:

答案 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)

  
      
  1. 当我在wall table中更新wall_id时,wall_categories表中的wall_id是否也会更新?因为wall_categories表中的wall_id引用了wall表中的wall_id。

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

  4.   

不,更新不会自动发生。实际上,您会得到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)

没有。它不会自动更新。什么是数据库?你是什​​么?