根据另一列的值更新列值

3
我正在处理图书馆数据库,其中包含一个名为book_transaction的表格。有两列分别叫做issued_date和due_date。due_date应该是issued_date后7天。我可以在创建表格时使用default关键字来指定这个条件吗?
如果不行,请提供相应的替代方案。
谢谢。

1
你可以使用计算列来实现这个目的。 - fabulaspb
谢谢,我现在明白了。 - Narasimha Maiya
3个回答

4

Oracle的default约束不能引用其他列。您可以使用触发器获得相同的功能(请参见此答案):

CREATE TRIGGER book_transaction_trigger
  BEFORE INSERT ON book_transaction
  FOR EACH ROW
BEGIN
  IF :new.due_date IS NULL THEN
    :new.due_date := :new.issued_date + 7;
  END IF;
END book_transaction_trigger;

您可以通过给日期加上一个数字来增加天数。date是指日期。

好的,我知道,但是我能不使用触发器或存储过程来完成吗? - Narasimha Maiya

3
您可以为表创建触发器。
CREATE TRIGGER test_trigger BEFORE INSERT ON `book_transaction` 
FOR EACH ROW SET NEW.issued_date = IFNULL(NEW.entryDate,NOW()),
NEW.due_date = TIMESTAMPADD(DAY,7,NEW.issued_date)

2
感谢“fabulaspb”提供的有用评论。我想到了这个。
create table book_transaction
(
  transaction_number int primary key,
  book_isbn          int REFERENCES book_master(book_isbn),
  student_code       int references student_master(student_code),
  issued_date        date default sysdate,
  due_date           date as (issued_date+7),
  submited_date      date,
  fine               int
);

表格已经成功创建,运行正常。感谢您的使用。

是的,这是更聪明的做法。 - Wernfried Domscheit
请注意,列 due_date 是一个虚拟列,即您无法更改其值,它始终为 issued_date+7。 - Wernfried Domscheit
好的。谢谢你提醒我。 - Narasimha Maiya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接