[英]Many-to-one with table records requiring one another
我有兩個表:Talks和Days。 對話看起來像:
+----+----------------------------------+--------+
| Id | Name | Leader |
+----+----------------------------------+--------+
| 1 | How to improve revenue for tacos | Tacob |
| 2 | Improving sales potential | Bocat |
+----+----------------------------------+--------+
和日子:
+--------+-----+
| TalkId | Day |
+--------+-----+
| 1 | Mon |
| 1 | Tue |
| 1 | Thu |
| 2 | Mon |
| 2 | Tue |
+--------+-----+
TalkId
是引用Talks
表的外鍵。
外鍵強制執行“一天需要交談”的關系。 但是,我也想強制執行相反的關系“談話至少需要一天”。
我知道此約束類似於多對多關系,其中兩條記錄彼此依賴。 但是,在這種情況下,很多天引用一個演講,但是只有一個演講引用了很多天。
另一個問題是,在創建了這樣的約束之后,如何一次插入兩個記錄?
我搜索了其他問題,僅發現了多對多關系的情況,結果如下:
+----+----------------------------------+--------+
| Id | Name | Leader |
+----+----------------------------------+--------+
| 1 | How to improve revenue for tacos | Tacob |
| 2 | Improving sales potential | Bocat |
+----+----------------------------------+--------+
+----+-----+
| Id | Day |
+----+-----+
| 1 | Mon |
| 2 | Tue |
| 3 | Thu |
| 4 | Mon |
| 5 | Tue |
+----+-----+
+--------+-------+
| TalkId | DayId |
+--------+-------+
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 4 |
| 2 | 5 |
+--------+-------+
其中TalkId
引用Talks
的Id
而DayId
引用Days
的Id
。
編輯 :
忽略我上面的要求。
我希望能夠做的是:
SELECT
所有有效的Talks
SELECT
所有有效Days
我希望無法做的是:
INSERT
沒有Day
的Talk
INSERT
一Day
沒有Talk
聽起來您想要一個簡單的外鍵關系:
alter table days add constraint fk_days_talkid foreign key (talkid) references talks(talkid);
這樣可以保證talkid
有效。 然后,將days.talkid
聲明days.talkid
not null
並保證所描述的關系。
-- Day named (TheDay) exists. -- Calendar {TheDay} PK {TheDay} -- Talk (TalkID) titled (TalkName), presented by (Leader) is by default -- scheduled on (DefaultDay). Talk {TalkID, TalkName, Leader, DefaultDay} PK {TalkID} AK {TalkName} FOREIGN KEY {DefaultDay} REFERENCES Calendar {TheDay} --Talk (TalkID) is also scheduled on (TheDay). -- TalkDay {TalkID, TheDay} PK {TalkID, TheDay} FOREIGN KEY {TalkID} REFERENCES Talk {TalkID} FOREIGN KEY {TheDay} REFERENCES Calendar {TheDay}
Note PK = primary key AK = alternate key (unique) All attributes (columns) NOT NULL
選擇全天進行特定演講:
select TalkName, DefaultDay as TalkDay from Talk where TalkName = 'How to improve revenue for tacos' union select TalkName, b.TheDay as TalkDay from Talk as a join TalkDay as b on b.TalkID = a.TalkID where a.TalkName = 'How to improve revenue for tacos'
選擇特定日期的所有對話:
select TalkName, DefaultDay as TalkDay from Talk where DefaultDay = 'Tue' union select TalkName, b.TheDay as TalkDay from Talk as a join TalkDay as b on b.TalkID = a.TalkID where b.TheDay = 'Tue'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.