SQL触发器用INSERT上的当前日期替换表中的空值?

Posted

技术标签:

【中文标题】SQL触发器用INSERT上的当前日期替换表中的空值?【英文标题】:SQL Trigger To Replace Null Values in table with Current Date on INSERT? 【发布时间】:2017-04-21 23:48:23 【问题描述】:

我正在编写一个触发器,它替换插入到我的Appointments 表的dates(类型为DATE)列中的任何NULL 值。但我不知道如何插入当前日期。

我的触发代码:

CREATE OR REPLACE TRIGGER appointment_date_insert
BEFORE INSERT
ON appointments
FOR EACH ROW
WHEN (NEW.dates IS NULL)
BEGIN
     :NEW.dates := NOW();
END;
/

上面给了我编译器日志中的错误:

NOW() 必须声明

我也尝试使用 GETDATE() 而不是 NOW(),但它在编译器日志中给出了与上面相同的错误。


为了测试此触发器,我的示例INSERT 查询与NULLdates 列值如下:

INSERT INTO appointments
VALUES (1, 'John', 'Doe', NULL);

我的appointments 表只有 4 列:patient_IDfirst_namelast_namedates

理想情况下,最终结果应该在appointments 表中插入一个新行,如下所示:

1 |约翰 |能源部 | 04-21-2017

用当前日期替换NULL


编辑:我不允许更改任何原始表结构,包括 DEFAULT 值,否则我一开始就不需要问这个问题....

【问题讨论】:

能否修改表格,让日期字段的默认值为getdate()? 没有。不允许更改任何原始表格。必须使用触发器。 在 Oracle 中,我们使用 SYSDATE 来获取当前日期::new.dates := sysdate; 【参考方案1】:

编辑如果没有now() 的同义词,这个带有now() 的解决方案将无法工作。

如果是NULL,您可以使用COALESCE:NEW 日期替换为NOW(),否则不要理会它:

CREATE TABLE APPOINTMENTS(PATIENT_ID NUMBER, FIRST_NAME VARCHAR2(64), LAST_NAME VARCHAR2(64), DATES DATE);

CREATE OR REPLACE TRIGGER appointment_date_insert
BEFORE INSERT
  ON appointments
FOR EACH ROW
  BEGIN
    :NEW.dates := COALESCE(:NEW.DATES,NOW());
  END;
/

然后测试一下:

INSERT INTO appointments VALUES (1, 'John', 'Doe', NULL);
INSERT INTO appointments VALUES (2, 'Jane', 'Doe', SYSDATE - 100);

SELECT * FROM APPOINTMENTS;

PATIENT_ID  FIRST_NAME  LAST_NAME  DATES      
1           John        Doe        21-APR-17  
2           Jane        Doe        11-JAN-17  

作为NOW() 的替代品,您可以考虑SYSDATE(或CURRENT_DATE,如果您愿意)

CREATE OR REPLACE TRIGGER appointment_date_insert
BEFORE INSERT
  ON appointments
FOR EACH ROW
  BEGIN
    :NEW.dates := COALESCE(:NEW.DATES,SYSDATE);
  END;
/

【讨论】:

不幸的是我已经尝试过了,它仍然告诉我必须声明NOWGETDATE 也一样。 感谢@5120bee,这很有趣。我会用另一个或两个替代方案更新帖子。你能告诉我你使用的是什么版本的 oracle 吗? 我有 11.2.0.2.0 Oracle 中没有NOW();相反,有SYSDATE 我刚刚运行了select now() from dual,它抛出了一个异常——now() 无法识别。我在 12.1,所以它不是旧版本。

以上是关于SQL触发器用INSERT上的当前日期替换表中的空值?的主要内容,如果未能解决你的问题,请参考以下文章

用另一个表中的列值替换列的空值

SQL Server 触发 CAST 函数

sql server 查询 order by 与 union 并替换多个列的空值

创建一个触发器,当另一个表中的列更新时更新一个表上的列

Microsoft Access 2016 查询为链接表中的空日期返回 1/1/1800

使用mysql中的select语句替换sql中的空值?