【发布时间】:2015-04-15 07:35:48
【问题描述】:
我在 unix 中执行 sql 查询。但我没有发现查询中的错误。
CREATE TABLE flights ( route_id NUMBER(10) NOT NULL,
depart_timestamp TIMESTAMP WITH TIME ZONE NOT NULL,
arrive_timestamp TIMESTAMP WITH TIME ZONE NOT NULL,
base_price_usd NUMBER(17,2) NOT NULL CHECK (base_price_usd > cast(0.0 as clob)::money),
status_id INTEGER NOT NULL,
PRIMARY KEY (route_id, depart_timestamp),
FOREIGN KEY (route_id) REFERENCES routes(route_id),
FOREIGN KEY (status_id) REFERENCES route_statuses(status_id) );
第 2 行出现错误:
ORA-00905:缺少关键字
ORA-00907: 缺少右括号
【问题讨论】:
-
第四行没有意义。为什么将 0 转换为 CLOB?只需使约束 CHECK base_price_usd>0。哦,据我所知,您不能将 TIMESTAMP WITH TIMEZONE 列用作复合主键的一部分。
-
我已经更改了查询,但在 oracle 8.0.6.3 查询中仍然出现相同的错误:CREATE TABLE 航班(route_id NUMBER(10) NOT NULL,depart_timestamp TIMESTAMP WITH TIME ZONE NOT NULL,arrive_timestamp TIMESTAMP WITH TIME ZONE NOT NULL, base_price_usd NUMBER(17,2) NOT NULL CHECK (base_price_usd > 0), status_id INTEGER NOT NULL, PRIMARY KEY (route_id), FOREIGN KEY (route_id) REFERENCES routes(route_id), FOREIGN KEY (status_id) REFERENCES route_statuses(status_id) );
-
TIMESTAMP WITH TIME ZONE 数据类型在 Oracle 10g 中实现。它在 Oracle 8 中不起作用。
-
那我用哪种数据类型代替它。
-
您可以使用简单的 DATE 数据类型。如果确实需要存储时区,至少要迁移到Oracle 10g。