给出的是带有此 DDL 的 Firebird 5.0 表:
CREATE TABLE KASSE_DETAILEDSTATISTICS
(ORDERDATE KASSE_ORDERTIMESTAMP NOT NULL,
PRODUCTID KASSE_PRODUCTID NOT NULL,
CONSUMPTIONPLACE KASSE_INHAUS NOT NULL,
ORDERTYPE KASSE_ORDERTYPE NOT NULL,
QUANTITY KASSE_QUANTITY NOT NULL,
PRICESUM KASSE_PRICE,
TRAININGPURCHASE KASSE_BOOLEAN NOT NULL,
KASSE_ID KASSE_Z_KASSE_ID);
ALTER TABLE KASSE_DETAILEDSTATISTICS ADD PRIMARY KEY (ORDERDATE,PRODUCTID,CONSUMPTIONPLACE);
CREATE UNIQUE INDEX IDX_KASSE_DETAILEDSTATISTICS ON KASSE_DETAILEDSTATISTICS(ORDERDATE,PRODUCTID,CONSUMPTIONPLACE);
现在我尝试添加另一列,如下所示:
ALTER TABLE KASSE_DETAILEDSTATISTICS ADD TEST INTEGER;
但是在尝试提交时总是会导致此失败消息:
Conversion error from string " . . : : ".
SQL Code: -413
IB Error Number: 335544334
好吧,看起来像是日期相关的,但是为什么 Firebird 想要转换一些 空字符串转换为时间戳? Firebird 只需添加一列即可!
表包含数据,ORDERDATE列仅包含有效的时间戳值!
此错误是由您的自定义域之一的默认值无效引起的。我猜是
KASSE_ORDERTIMESTAMP
,默认设置为 ' . . : :'
。
我猜你最初是在旧版本(我猜是 2.5 或更早版本,还没有测试过)中创建了这个数据库,在添加列时没有验证
NOT NULL
列。
现在,在 Firebird 5.0(我猜是 3.0 及更高版本)中,当您添加列时,Firebird 将生成一个新的格式版本,此时,将评估默认值,并产生此错误,因为它不是有效值.
您需要更改域以删除其默认值,然后才能添加新列:
alter domain ts_invalid drop default;
注意:这个答案基于推测和一些实验中观察到的行为。您的环境中可能还存在其他问题。如果您提供一个最小的可重复示例,我可能会提供更准确的答案。