H2 資料庫測試出現 JdbcSQLSyntaxErrorException

情境

這幾天在測試 H2 資料庫用於單元測試,寫了一個 LoginVaildation (可參考我的 Github 專案)。

其中創建了 schema.sql & data.sql 用於表的創建與資料的建置。

schema.sql

1
2
3
4
5
CREATE TABLE USER (
EMAIL VARCHAR(30) PRIMARY KEY,
PXSSWORD VARCHAR(12),
USERNAME NVARCHAR(30)
);

data.sql

1
INSERT INTO USER (EMAIL, PXSSWORD, USERNAME) VALUES ('willy4543@gmail.com', 'Demo1234', 'William');

執行後報出 JdbcSQLSyntaxErrorException

1
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "CREATE TABLE [*]USER ( EMAIL VARCHAR(30) PRIMARY KEY, PASSWORD VARCHAR(12), USER_NAME NVARCHAR(30) )"; expected "identifier";

原因

USER 在 H2 內雖然不是 Table 的保留字,但 USER 是一個保留的標誌符 (identifier),所以 H2 資料庫會把它當作當前登錄的用戶名稱。這就會導致指令出錯,拋出錯誤訊息告知在指令中出現了無效的標誌符。

解法

把 TABLE 的名稱從 USER 更改為 PROJECT_USER 即可。


有時候這種來自小小設定的問題,似乎也只在遇到的時候記得,簡單紀錄一下。