下表存盤了不同日期范圍的產品價格
id
productID
startDate
endDate
price
如何在資料庫級別確保給定日期沒有多個條目。(MongoDB / MySQL)
正確設定
startDate endDate
2020-01-01 2020-01-05
2020-01-07 2020-01-07
2020-01-08 2020-01-20
設定不正確
日期 2020-01-04 有兩個條目(第一和第二)
startDate endDate
2020-01-01 2020-01-05
2020-01-04 2020-01-07
2020-01-08 2020-01-20
uj5u.com熱心網友回復:
CREATE TRIGGER check_for_overlapping
BEFORE INSERT
ON prices
FOR EACH ROW
BEGIN
IF EXISTS ( SELECT NULL
FROM prices
WHERE prices.productID = NEW.productID
AND prices.startDate <= NEW.EndDate
AND NEW.startDate <= prices.EndDate ) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Entered data overlaps with existing data';
END IF;
END;
演示
uj5u.com熱心網友回復:
更改架構。
嚴重地。你有多余的資訊。缺少資訊(參見“2020-01-6”)。
與其有開始和結束,不如只有開始。(等效地,您只能有一個“結束”日期。)
一個條目的“結束”由下一行的“開始”給出。(見下例)
既然你似乎有未分配的日子;“產品”在那段時間(例如 2020-01-06)不可用嗎?如果這是有效的業務邏輯,請添加一行以某種方式表明這一點。
對于 IP 地址范圍,我執行了上述操作。(并且間隙是有效的——它們指的是“未分配的”IP。)參見http://mysql.rjweb.org/doc.php/ipranges。它包括許多操作(插入、查找、修改等)的代碼,這些代碼需要從“ip-address”改為“date”。
正如 Akina 所指出的,插入代碼有責任確保資料符合業務邏輯規則。
2020-01-07 2020-01-07在您的示例中是否意味著“所有第 7 個”?如果是這樣,那么在邏輯上是這樣的>= '2020-01-07' AND < '2020-01-08'。這適用于我的 IP 類比等。
請注意,我選擇為所有操作存盤例程。這避免了“在每次操作后執行驗證查詢”的需要
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/354253.html
上一篇:Mongo按對聚合分組
