我是编码新手,所以我在 SQL Server 中创建了一个表并且它可以工作,所以我在 H2 中使用了相同的命令,它说我的第二个表有语法问题,有人可以帮忙吗?
CREATE TABLE TOURISTINFO(
TOURISTINFO_ID INT PRIMARY KEY,
NAME VARCHAR(25) NOT NULL,
NATIONALITY VARCHAR(15) NOT NULL
)
CREATE TABLE PLANETICKETS(
DESTINATION VARCHAR(10) NOT NULL,
TICKETPRICE NUMERIC(8,2) NOT NULL,
TOURISTINFO_ID INT FOREIGN KEY REFERENCES TOURISTINFO
)
错误是
Syntax error in SQL statement "CREATE TABLE PLANETICKETS(
DESTINATION VARCHAR(10) NOT NULL,
TICKETPRICE NUMERIC(8,2) NOT NULL,
TOURISTINFO_ID INT FOREIGN[*] KEY REFERENCES TOURISTINFO
)"; expected "(, FOR, UNSIGNED, NOT, NULL, AS, DEFAULT, GENERATED, NOT, NULL, AUTO_INCREMENT, BIGSERIAL, SERIAL, IDENTITY, NULL_TO_DEFAULT, SEQUENCE, SELECTIVITY, COMMENT, CONSTRAINT, PRIMARY, UNIQUE, NOT, NULL, CHECK, REFERENCES, ,, )"; SQL statement:
CREATE TABLE PLANETICKETS(
DESTINATION VARCHAR(10) NOT NULL,
TICKETPRICE NUMERIC(8,2) NOT NULL,
TOURISTINFO_ID INT FOREIGN KEY REFERENCES TOURISTINFO
) [42001-173] 42001/42001
原文由 l3kov 发布,翻译遵循 CC BY-SA 4.0 许可协议
我会在@david-brossard 的回答中添加一个选项:
通过使用 约束名称定义,外键被显式命名,否则 H2 会根据它自己的命名方案为其分配一个名称,例如 CONSTRAINT_74。
我觉得这可以通过避免名称使用的歧义和引用之前直接定义的名称来让以后管理约束更加安全,例如
基于我对可安装软件产品的 Flyway 的使用,我已经开始将其作为标准操作。
从理论上讲,Flyway 迁移的顺序应该导致以相同的顺序应用约束(包括外键),因此 H2 应该在每个数据库副本中分配相同的名称。但是,如果分配了直接名称(在以前的迁移脚本中引用的名称)而不是通过检查单个数据库实例中分配的名称推断出的名称,则担心点会被消除。