我有一张表,我使用下面的代码创建。
create table Meter (MeterID CHAR(8) CONSTRAINT MeterPK PRIMARY KEY,
Value CHAR(8) CONSTRAINT ValueNN NOT NULL,
InstalledDate Date CONSTRAINT InDateNN NOT NULL);
然后我尝试添加一个派生列,为已安装的日期增加6个月。
alter table meter add ExpiryDate as (add_months(installedDate,6)) not null;
这将返回无效数据类型的错误。
我在某处读到了我不必指定ExpiryDate的数据类型,因为它可以从函数派生。那么我哪里出错了?
编辑:原来迈克是对的。我使用触发器方法来处理事情,但我很困惑我是使用mysql还是oracle。想想最后我实际上是在使用oracle。触发器有问题,但事实证明我不需要在触发器中使用“set”命令。以下是有效的代码。CREATE OR REPLACE
TRIGGER trigexpdate1
BEFORE INSERT ON Meter
FOR EACH ROW
BEGIN
:NEW.ExpiryDate := ADD_MONTHS(:NEW.InstalledDate, 6);
END;
如果我在语句中没有开头和结尾,则会抛出错误说非法触发器规范。
答案 0 :(得分:0)
MySQL不支持
add_months()
或这是在MySQL中编写该语句的或多或少的标准方法。
create table `Meter` (
`MeterID` CHAR(8) NOT NULL,
`Value` CHAR(8) NOT NULL,
`InstalledDate` Date NOT NULL,
primary key (`MeterID`)
);
派生列有两个选项,例如" ExpiryDate"。
BEFORE INSERT触发器示例
create table `Meter` (
`MeterID` CHAR(8) NOT NULL,
`Value` CHAR(8) NOT NULL,
`InstalledDate` Date NOT NULL,
`ExpiryDate` Date not null,
primary key (`MeterID`)
);
create trigger trigexpdate1
before insert on `Meter`
FOR EACH ROW
SET NEW.`ExpiryDate` = date_add(NEW.`InstalledDate`, interval 6 month);
注意ExpiryDate如何从insert语句更改为下面的select语句。
insert into Meter
values ('1', '1', '2014-07-01', '2014-07-01');
select * from Meter;
MeterID Value InstalledDate ExpiryDate -- 1 1 2014-07-01 2015-01-01