假設數據庫中有兩個表。第一個是X,第二個是Y. Y表在X表上有一個外鍵。因此,如果在Y表上有記錄,則X表上必須存在與外鍵相關的列值。這是默認行爲。對於表中的所有記錄如何保證外鍵相關表上至少有一條記錄?
X Y
------- -------
ID ID
XID <--- Foreignkey to X table.
現在,對於X表中的所有記錄,我想保證Y表中至少有一條記錄。如果沒有,它應該自動添加一個。我怎樣才能做到這一點?
假設數據庫中有兩個表。第一個是X,第二個是Y. Y表在X表上有一個外鍵。因此,如果在Y表上有記錄,則X表上必須存在與外鍵相關的列值。這是默認行爲。對於表中的所有記錄如何保證外鍵相關表上至少有一條記錄?
X Y
------- -------
ID ID
XID <--- Foreignkey to X table.
現在,對於X表中的所有記錄,我想保證Y表中至少有一條記錄。如果沒有,它應該自動添加一個。我怎樣才能做到這一點?
這裏有兩個不同的問題。
「正常」的方式,以保證行存在於Y表示在X每行包括在都表的外鍵。每個表引用另一個表。
create table x (
x_id integer primary key,
y_id integer not null
);
create table y (
y_id integer primary key,
x_id integer not null references x (x_id)
);
alter table x
add constraint one_to_one
foreign key (y_id)
references y (y_id) deferrable initially deferred;
begin transaction;
insert into x values (1, 100);
insert into y values (100, 1);
commit;
雖然這保證了每一個「X」有一個「Y」,可以這麼說,這並不能保證每一個「X」有不同「Y」,或者說每一個「X」有它自己的「y」。我不確定這是否是您的要求。
這不是相當於你在找什麼,因爲你的兩張桌子之間有1:N的關係。你可以讓它工作,但我認爲你必須編寫一個觸發器來管理對錶「y」的更改。例如,如果用戶從「y」中刪除「x」持有外鍵引用的行,則需要更新「x」以引用「y」中的不同行。
但是這會導致第二個問題:管理插入,更新和刪除。有幾種方法可以做到這一點。
存儲過程和可更新視圖可以給你一定程度的自動添加「y」行,但你必須編寫程序代碼來做到這一點。
感謝您的回答。 Storedprocs是我看到的最好的方法。 –
要插入錯過記錄到Y
現有數據,你可以運行類似
INSERT INTO Y(xid)
SELECT x.id
FROM x
WHERE NOT EXISTS(SELECT NULL FROM Y a WHERE a.xid = x.id);
爲了防止這樣的事情在未來,寫這兩個表插入數據的過程,防止大家從插入數據(只通過這個程序)
那麼你是從X中在Y表中設置一個外鍵。所以你輸入到Y表中的每個記錄都有'XID'不是嗎? (因爲外鍵不能爲空)那麼問題是什麼?我假設你打算說**「現在,對於Y表中的所有記錄,我想保證X表格中至少有一條記錄,如果沒有,應該自動添加一條記錄。」** – bonCodigo
I我想我無法解釋我想要什麼。認爲有一本書,我想保證必須至少有一個頁面。假設書和頁面是數據庫中的表格。 –