如何在一个表中使用属性来计算另一表中的属性值?

时间:2019-05-01 00:26:41

标签: mysql sql database

我正在SSH Secure Shell中构建一个小型库数据库。我的表CHECKOUT具有属性CheckoutDate。我还有另一个具有属性CheckinDue的表CHECKIN。我试图弄清楚如何获取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属于次要),因此我对触发器和存储函数的东西有点迷茫。

2 个答案:

答案 0 :(得分:0)

我在您的代码中看不到CREATE TRIGGER语句。另外,您正在对CheckoutID = 1进行硬编码,当您插入第二条记录时,该功能将无效。

我认为触发器中的“ NEW”关键字可能就是您所缺少的吗?

我会这样做:

public List<Test> Fails
{
    get
    {
        return new List<Test>() { new Test() { Name = "0" } }; 
    }
}

答案 1 :(得分:0)

您的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 ;