我想知道如何在同一个sql数据库中的多个表中更新同一列但是这些表通过该列相互关联,该列是一个主键,而其他表中的forg键是C#请帮帮我
答案 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)
您想要回答的问题是带有级联更新的外键,如抖动答案中所述。但是,与大多数设计考虑因素一样,如果您回过头来分析执行此类操作的基本需求,则无需提出此问题。
虽然这有效,但这意味着数据库实体上的主键随着时间的推移不可靠,这也意味着数据库可能需要做大量的工作才能进行级联(并且它必须维护更多锁定执行这样的更新,这增加了阻止的可能性。)
关于可靠性随着时间的推移,假设您有一个仓库可以维护帐户的历史余额:AcctPK
,EffectiveDate
,Balance
,现在您可能拥有大量的如果您将更新添加到数据库中的另一个级联FK关系,则将更新级联为行。如果数据仓库位于单独的数据库中,则无法强制实施参照完整性,因此不会发生级联,现在您在AcctPK
更改之前不再具有帐户的连续性。
假设您将数据导出到为每行提供某种信息服务的供应商。现在,当供应商返回结果时,您无法匹配某些行,因为您发送的PK不再存在于您的数据中。
在这两种情况下,你可以通过保持PK随时间变化的记录来解决这个问题,但最终,它可以解决一个(可能)糟糕的PK选择。
我强烈建议您重新考虑您选择的主键,如果它经常发生变化。一种替代方案是使用代理IDENTITY
或自动编号作为PK(而基于该代替的FK关系)。它永远不需要级联更新,而您当前用作“自然”主键的其他字段可以在正常UPDATE
中更改,而无需进行级联。