GENERATED ALWAYS AS IDENTITY 使用 UCanAccess 生成不正确的 table 模式

GENERATED ALWAYS AS IDENTITY produces incorrect table schema with UCanAccess

我正在使用 JDBC/UCanAccess 编写一个程序,当我创建 table 之一时,我发现它没有使用 DateTime 格式创建四列,而是同样适用格式到下一列,取代其他格式:

CREATE TABLE Person (
    Id INT NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1), 
    Name VARCHAR(40), 
    Surname VARCHAR(40), 
    Card VARCHAR(9), 
    Email VARCHAR(30)
);

CREATE TABLE Place (
    Id INT NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1), 
    Name VARCHAR(40)
);


CREATE TABLE Activity (
    Id INT NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1), 
    Name VARCHAR(40) NOT NULL, 
    Description1 VARCHAR(500), 
    Description2 VARCHAR(500), 
    Id_Person INT, 
    Hour_Start DATETIME, 
    Hour_End DATETIME, 
    Date_Plan_Start DATETIME, 
    Date_Plan_End DATETIME, 
    Cost CURRENCY, 
    Sale CURRENCY, 
    Id_Place INT, 
    CONSTRAINT fk_person_activity FOREIGN KEY (Id_Person) REFERENCES Person (Id), 
    CONSTRAINT fk_place_activity FOREIGN KEY (Id_Place) REFERENCES Place (Id)
);

在 Date_Plan_End 之前,它似乎可以做所有它应该做的事情,但是创建的 table 将 Cost 作为 DateTime,将 Id_Place 作为 Currency。如果有人能告诉我为什么会这样,我将不胜感激。

编辑:错误剧照仅在插入时发生:

CREATE TABLE Activity (
    Id INT NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1), 
    Name VARCHAR(40) NOT NULL, 
    Date_Plan_End DATETIME, 
    Cost CURRENCY, 
    Sale CURRENCY, 
    Id_Place INT, 
    PRIMARY KEY (Id)
);

SQL and outcome

问题似乎与 GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1) 有关。它的移除阻止了位移的发生,虽然我不知道为什么。

The problem seems to be related to the GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1). Its removal stops the displacement from happening

那是因为... GENERATED ALWAYS AS IDENTITY ...是HSQLDB DDL语法,而UCanAccess使用的是Access SQL DDL语法。因此而不是

CREATE TABLE Activity (
    Id INT NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1), 
    Name VARCHAR(40) NOT NULL, 
    Date_Plan_End DATETIME, 
    Cost CURRENCY, 
    Sale CURRENCY, 
    Id_Place INT, 
    PRIMARY KEY (Id)
);

你应该使用

CREATE TABLE Activity (
    Id COUNTER PRIMARY KEY, 
    Name VARCHAR(40) NOT NULL, 
    Date_Plan_End DATETIME, 
    Cost CURRENCY, 
    Sale CURRENCY, 
    Id_Place INT
);