簡體   English   中英

多對一的表記錄需要彼此

[英]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引用TalksIdDayId引用DaysId

編輯

忽略我上面的要求。

我希望能夠做的是:

  1. SELECT所有有效的Talks
  2. SELECT所有有效Days

我希望無法做的是:

  1. INSERT沒有DayTalk
  2. INSERTDay沒有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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM