Как использовать атрибут в одной таблице для вычисления значения атрибута в другой таблице? - PullRequest
0 голосов
/ 01 мая 2019

Я создаю небольшую библиотечную базу данных в 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), так что я немного потерян в триггере и хранимых функциях.

Ответы [ 2 ]

0 голосов
/ 01 мая 2019

Ваша таблица DDD Checkout, вероятно, должна добавить AUTO_INCREMENT, чтобы вы получали новое значение последовательного ключа для каждой вставки, вместо того, чтобы вручную вычислять это каждый раз, когда вы вставляете новую строку Checkout.

Триггер, который вставит соответствующую строку Checkin, будет выглядеть примерно так:

Обратите внимание на использование специального НОВОГО псевдоряда ...

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 ;
0 голосов
/ 01 мая 2019

Я не вижу оператора 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...