我已經在DB上使用以下字段作爲PK:DOC_ID
,SECTION_ID
,SET_ID
,CELL_ID
。正如您可以推斷的那樣,這是指一組Excel電子表格。更新多個記錄,臨時密鑰重疊
除了這些字段,我還有一個CELL_ROW
字段和CELL_COL
字段。 與SET_ID
(獨特),他們形成一個替代關鍵。因此,至少在理論上,如果我想交換兩個單元格的座標,我需要釋放該約束,或者使用第三個臨時自由位置(例如A100000例如)。
假設我有以下細胞:
DOC_ID | SECTION_ID | SET_ID | CELL_ID | CELL_ROW | CELL_COL
--------|------------|--------|---------|----------|----------
5 | 456 | 8778 | 15045 | 5 | 4
5 | 456 | 8778 | 15048 | 5 | 5
而且假設我有我從中執行UPDATE
到主表中的下列臨時表:
DOC_ID | SECTION_ID | SET_ID | CELL_ID | CELL_ROW | CELL_COL
--------|------------|--------|---------|----------|----------
5 | 456 | 8778 | 15045 | 5 | 5
5 | 456 | 8778 | 15048 | 5 | 4
理論上,UPDATE
應提出例外...
但剛試過,它的工作原理!
你能解釋一下爲什麼嗎? Oracle是否將其作爲原子操作執行,因此只有在整個操作(而不是每個記錄的記錄)之後檢查約束?
MS SQL Server 2008 r2和Postgres在這種情況下的表現如何?
感謝您的回答!其實,我沒有與Postgres社區聯繫。在我的公司,我們提供了對所提到的DBMS的全面支持,但自從我一年前聘用PostgreSQL後,我從未從事過Postgres工作。 – Teejay 2013-02-26 13:16:12
我在SQL Server上試過,似乎沒有問題。現在,對於PG,是否有辦法改變一個約束並將其設置爲「DEFERRABLE」?或者這個屬性只能在創建表格時設置?請注意,約束不是FK。 – Teejay 2013-02-26 15:19:27
決定在數據庫創建時將其設置爲DEFERRABLE以解決問題。 – Teejay 2013-02-26 23:34:01