如何更新多个表中的同一列

时间:2009-06-21 14:54:45

标签: c# sql

我想知道如何在同一个sql数据库中的多个表中更新同一列但是这些表通过该列相互关联,该列是一个主键,而其他表中的forg键是C#请帮帮我

3 个答案:

答案 0 :(得分:1)

您可以在外键约束上指定所需内容。点击此处查看MySQL syntax

这样的东西也适用于你的sql-dialect。

[CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...)
  REFERENCES tbl_name (index_col_name, ...) ON UPDATE CASCADE

CREATE TABLE Parent(
  PID SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
  Name VARCHAR(20),
  PRIMARY KEY (PID)
);

CREATE TABLE Child(
  CID SMALLINT UNSIGNED NOT NULL PRIMARY KEY,
  PID SMALLINT UNSIGNED NOT NULL,
  FOREIGN KEY (PID) REFERENCES Parent (PID)
    ON UPDATE CASCADE
);

INSERT INTO PARENT (Name) VALUES ('Joe');
INSERT INTO PARENT (Name) VALUES ('Max');
INSERT INTO Child (CID, PID) VALUES (1, 1);
INSERT INTO Child (CID, PID) VALUES (2, 2);

SELECT * FROM Parent;
SELECT * FROM Child;

Parent             Child
+------+------+    +------+------+
| PID  | Name |    | CID  | PID  |
+------+------+    +------+------+
| 1    | Joe  |    | 1    | 1    |
+------+------+    +------+------+
| 2    | Max  |    | 2    | 2    |
+------+------+    +------+------+

UPDATE Parent SET PID='5000' WHERE PID='1';
SELECT * FROM Parent;
SELECT * FROM Child;

Parent             Child
+------+------+    +------+------+
| PID  | Name |    | CID  | PID  |
+------+------+    +------+------+
| 5000 | Joe  |    | 1    | 5000 |
+------+------+    +------+------+
| 2    | Max  |    | 2    | 2    |
+------+------+    +------+------+

在此示例中,可能存在问题,具体取决于您的DB-System。如果DB系统在某个点处于“AUTOINC模式”时未检查PID是否已经分配,​​则自动增量值可能达到5000并且插入可能会失败,因为已存在具有此PID的行。取决于当指定了自动增量时,DB-System如何处理主键列的更改

答案 1 :(得分:0)

更改主键永远不会有趣:这就是为什么许多人更喜欢synthetic自然键。没有单一语句标准的SQL方法;相反,您必须使用新主键INSERT主表行的副本,更新子表以引用新行,并删除原始行。

答案 2 :(得分:0)

您想要回答的问题是带有级联更新的外键,如抖动答案中所述。但是,与大多数设计考虑因素一样,如果您回过头来分析执行此类操作的基本需求,则无需提出此问题。

虽然这有效,但这意味着数据库实体上的主键随着时间的推移不可靠,这也意味着数据库可能需要做大量的工作才能进行级联(并且它必须维护更多锁定执行这样的更新,这增加了阻止的可能性。)

关于可靠性随着时间的推移,假设您有一个仓库可以维护帐户的历史余额:AcctPKEffectiveDateBalance,现在您可能拥有大量的如果您将更新添加到数据库中的另一个级联FK关系,则将更新级联为行。如果数据仓库位于单独的数据库中,则无法强制实施参照完整性,因此不会发生级联,现在您在AcctPK更改之前不再具有帐户的连续性。

假设您将数据导出到为每行提供某种信息服务的供应商。现在,当供应商返回结果时,您无法匹配某些行,因为您发送的PK不再存在于您的数据中。

在这两种情况下,你可以通过保持PK随时间变化的记录来解决这个问题,但最终,它可以解决一个(可能)糟糕的PK选择。

我强烈建议您重新考虑您选择的主键,如果它经常发生变化。一种替代方案是使用代理IDENTITY或自动编号作为PK(而基于该代替的FK关系)。它永远不需要级联更新,而您当前用作“自然”主键的其他字段可以在正常UPDATE中更改,而无需进行级联。