2017-08-25 59 views
0

我不確定如何將問題的詞語足夠好地提供給Google,這對Google很有幫助 - 大多數結果都是關於指定外鍵,以便您可以使用JOIN運算符。SQL強制實施需要某種邏輯的約束

編輯: 爲了澄清,我在這裏有兩個主要概念 - 跟蹤器和跟蹤器的讀數。跟蹤器可以有任意數量的輸入。跟蹤器的讀數對於該特定時間點的跟蹤器上的每個輸入具有值

Tracker 
    Id    (Key) 
    Name 

TrackerInput 
    TrackerId  (Key 0, Foreign key) 
    Index   (Key 1) 
    Name 

Reading 
    Id    (Key) 
    TrackerId  (Foreign key) 
    DateRecorded 
    Some other properties 

ReadingInput 
    ReadingId  (Key 0, Foreign key) 
    Index   (Key 1) 
    Value 

我如何通過SQL,執行下面的約束:

Tracker 
    Id 
    Name 
    Inputs (List) 
    Name 

Reading 
    Id 
    TrackerId 
    DateRecorded 
    Some other properties 
    Inputs (List) 
    Value 

我有以下結構建模這個

一個讀MUST包括一個價值它引用的跟蹤器上的每個輸入。

+0

您可以通過觸發器強制執行它 – Horaciux

+1

FK是表中某些列的值也必須是某些其他特定列和表的值的時候。您使用「FK」沒有意義。 (特別是,「複合外鍵,它目前分爲兩個表格」)。你能說出你想要的而不使用它嗎?在代碼中,請說一張表中的列列表引用了其他表中的列列表。另外「輸入」是什麼意思?行的輸入表? PS您不需要PK,FK或任何其他約束來保持或聲明爲了加入。 – philipxy

+0

表格的CK是一個唯一的列集合,它不包含更小的唯一列集合。在表t中的FK(外鍵)被給出「(c,...)引用u(d,...)」,其中{d,...}是u的CK,並且如果t的行具有值爲v,...爲列c,...然後,某行的值爲v,...爲列d,...。對於每個表,給出它的CK和FK。 – philipxy

回答

2

的輸入上的讀取MUST指在跟蹤器的輸入,但它需要一個複合外鍵,這是目前分在兩個表。如果我要強制執行外鍵約束,他們將不得不加入:

SELECT TrackerId, Index -- This is the foreign key I would like to enforce 
FROM Readings 
JOIN ReadingInputs ON ReadingId = Id 

我猜你的問題,你的意思,你想執行這一Reading & ReadingInput受到的版本他們加入(因此該視圖/查詢)滿足約束foreign key (TrackerId, Index) references TrackerInput (TrackerId, Index)

你可以聲明加入IndexReading,丟棄當前Reading & ReadingInput FKS並添加FKS

(TrackerId, Index) references TrackerInput (TrackerId, Index) -- Reading 
(ReadingId, Index) references Reading (Id, Index) -- ReadingInput 

否則,你可以使用觸發器做到這一點。

+0

我不能合併'Reading'和'ReadingInput' - 我已經更新了問題來解釋一下這個關係。我從來沒有使用過觸發器,你能舉一個通過觸發器強制執行的快速例子嗎? –