簡體   English   中英

如何使用一個表中的屬性來計算不同表中屬性的值?

[英]How to use an attribute in one table to calculate the value of an attribute in a different table?

我正在SSH Secure Shell中構建一個小型庫數據庫。 我的表CHECKOUT有一個屬性CheckoutDate。 我有另一個表CHECKIN具有屬性CheckinDue。 我試圖找出如何獲取CheckoutDate的值並使用它來計算CheckinDue並將其插入到CHECKIN中。

到目前為止,我試圖用觸發器做到這一點,但我被卡住了。 這是我到目前為止所擁有的:

create table CHECKOUT(
CheckoutID int(5) not null unique primary key,
CheckoutStatus varchar(3),
CheckoutDate date,
BookID int(5) not null, foreign key (BookID) references BOOK(BookID),
MemID int(5) not null, foreign key (MemID) references MEMBER(MemID) );

create table CHECKIN(
CheckoutID int(5) not null unique,
MemID int(5) not null,
BookID int(5) not null,
primary key (CheckoutID, MemID, BookID),
foreign key (CheckoutID) references CHECKOUT(CheckoutID),
foreign key (MemID) references MEMBER(MemID),
foreign key (BookID) references BOOK(BookID),
CheckinDate DATE,
CheckinDue DATE,
CheckinLate int(1) );

 BEGIN
 declare tempDate DATE;
 declare calcDate DATE;

 SELECT CheckoutDate INTO tempDate FROM CHECKOUT WHERE CheckoutID = 1;

 SELECT DATEADD(day, 7, tempDate) into calcDate;

 UPDATE CHECKIN set CheckinDue = calcDate where CheckoutID = 1;

 END;

現在CHECKOUT顯示:

+------------+----------------+--------------+--------+-------+
| CheckoutID | CheckoutStatus | CheckoutDate | BookID | MemID |
+------------+----------------+--------------+--------+-------+
|          1 | OUT            | 2019-04-29   |     10 |     2 |

和CHECKIN顯示:

| CheckoutID | MemID | BookID | CheckinDate | CheckinDue | CheckinLate |
+------------+-------+--------+-------------+------------+-------------+
|          1 |     2 |     10 | 2019-05-07  |       NULL |        NULL |

我想要得到:

| CheckoutID | MemID | BookID | CheckinDate | CheckinDue | CheckinLate |
+------------+-------+--------+-------------+------------+-------------+
|          1 |     2 |     10 | 2019-05-07  | 2019-05-06 |        YES  |

這是我在SQL中完成的最先進的東西(數學專業,輔修CS)所以我有點迷失在觸發器和存儲功能的東西上。

我沒有在您的代碼中看到CREATE TRIGGER語句。 此外,您正在編碼CheckoutID = 1,這在插入第二條記錄時不起作用。

我想也許觸發器中的“NEW”關鍵字是你缺少的?

我會做這樣的事情:

CREATE TRIGGER CHECKIN_INSERT AFTER INSERT ON CHECKIN
FOR EACH ROW
BEGIN
    UPDATE CHECKIN
    SET CHECKIN.CheckinDate = DATE_ADD(
          (SELECT CHECKOUT.CheckoutDate 
           FROM CHECKOUT 
           WHERE CHECKOUT.CheckoutID = NEW.CheckoutID)
          , INTERVAL 7 DAY)
    WHERE CHECKIN.CheckoutID = NEW.CheckoutID;
END;

您的Checkout表DDL應該添加AUTO_INCREMENT,以便為每個插入獲取一個新的順序鍵值,而不是每次插入新的Checkout行時都必須手動計算出來。

將插入相應Checkin行的觸發器如下所示:

注意使用特殊的NEW偽行....

delimiter |

CREATE TRIGGER makeCheckin AFTER INSERT ON CHECKOUT
  FOR EACH ROW BEGIN
    INSERT INTO CHECKIN (CheckoutID, MemID, BookID, CheckinDue)
    VALUES (NEW.CheckoutID, NEW.MemID, NEW.BookID, DATE_ADD(NEW.CheckoutDate, INTERVAL 7 DAY))
  END;
|

delimiter ;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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