尝试更改表的无效数据类型

时间:2014-07-24 16:53:23

标签: sql oracle types

我有一张表,我使用下面的代码创建。

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;

如果我在语句中没有开头和结尾,则会抛出错误说非法触发器规范。

1 个答案:

答案 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"。

  1. 创建视图,并在视图中执行日期算术运算。使用date_add()
  2. 添加列" ExpiryDate"到桌面,并用触发器保持最新状态。

  3. 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