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