Table 1:
Name, x1-X2, fk1, fk2.
Table 2:
K1(parent for table 1),X
如何更新表1,其在FK-第二列X1-X2 depands,FK2从表2使用外键值的Oracle Sql更新?
Table1:
a,1.0,1,2
b,-3.0,2,3
Table 2
1,4.0
2,5.0
3,2.0
Table 1:
Name, x1-X2, fk1, fk2.
Table 2:
K1(parent for table 1),X
如何更新表1,其在FK-第二列X1-X2 depands,FK2从表2使用外键值的Oracle Sql更新?
Table1:
a,1.0,1,2
b,-3.0,2,3
Table 2
1,4.0
2,5.0
3,2.0
在此设置:
CREATE TABLE table2 (k NUMBER PRIMARY KEY, x NUMBER);
CREATE TABLE table1 (
NAME VARCHAR2(10) PRIMARY KEY,
diff NUMBER,
fk1 NUMBER REFERENCES table2,
fk2 NUMBER REFERENCES table2);
以下更新将“刷新”科拉姆table1.diff
与table2
值:
SQL> UPDATE (SELECT child.diff old_diff, parent2.x - parent1.x new_diff
2 FROM table1 child
3 JOIN table2 parent1 ON (child.fk1 = parent1.k)
4 JOIN table2 parent2 ON (child.fk2 = parent2.k))
5 SET old_diff = new_diff
6 WHERE old_diff != new_diff
7 OR (old_diff IS NULL AND new_diff IS NOT NULL)
8 OR (old_diff IS NOT NULL AND new_diff IS NULL);
只需要更新将被刷新(感谢where子句)的行。
你真的可以更新吗?这样的表达?我期望看到UPDATE table1 SET diff =(SELECT ...)WHERE(...);而SELECT将与你所拥有的相似 - 只用new_diff - 而最后一个三重点将是一个与你所拥有的相似的条件。 – 2009-09-08 12:14:05
是Jonathan,因为我们只更新子表并且连接保留键保存(对于每个连接,来自table1的一行指向使用该连接的最多一行table2)。自至少8i以来,更新保留键的子查询是可用的。 – 2009-09-08 13:14:50
不太知道我理解的问题,参照完整性约束并不妨碍你更新表。如果您需要在交易中进行大量工作,您可以查看延期约束。有没有可能澄清你的意思?
更新了qn.is,现在好吗? – 2009-09-08 10:54:27
不确定问题到底是什么,也许你需要重新解释一下这个问题。
通常,外键约束确保在被引用表中存在相应的行。
当您使用外键更新行,并尝试设置一个不指向此主行的值时,您会立即或在提交时(取决于何时执行该约束) ,它可以推迟)。
除此之外,更新与其他更新没有区别。
更新了qn.is,现在好吗? – 2009-09-08 10:54:57
由于表1中的数据取决于表2中的数据,因此您将无法直接“更新”表1。
您必须对表2进行更新,然后重新计算表1
你可以做一个交易或者是桌子上的触发器内2
另一种选择可能是有表一个只保存外键和名称,然后创建一个计算X1-X2值的视图。
编辑
看样本数据后,我不认为你可以明确地有表2可以更新,因为在表1
更新例如,如果你更新的结果表1的第二列是43,你怎么会知道什么值来设置表2的特定行(也可能是40和3,20和23等)
由于我正在处理已经创建的表格。我正在寻找更新第一个表的查询...一旦表table2中有更新,我将从我的应用程序中触发该查询。 – 2009-09-08 10:58:05
由于表1是(x1-x2),您现在将知道X的值是什么表2中的特定行。如果你有x1和x2列,你可以这样做,但我不确定你可以。除非我错过了一些东西。 – 2009-09-08 11:01:23
对不起,应该说“你不会知道” – 2009-09-08 11:01:58
既然你在表2中有X1和X2,为什么你需要fk1和fk2。你不能只用一个吗? – 2009-09-08 10:45:27
,因为表1有2行与表2映射 – 2009-09-08 10:46:53
那么,哪些行x1和x2 corespond? – 2009-09-08 10:48:07