在 H2 数据库中定义外键约束

新手上路,请多包涵

我是编码新手,所以我在 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 许可协议

阅读 1.4k
1 个回答

我会在@david-brossard 的回答中添加一个选项:

 CREATE TABLE PLANETICKETS(
  DESTINATION VARCHAR(10) NOT NULL,
  TICKETPRICE NUMERIC(8,2) NOT NULL,
  TOURISTINFO_ID INT,

  CONSTRAINT FK_PLANETICKET_TOURIST FOREIGN KEY (TOURISTINFO_ID) REFERENCES TOURISTINFO(TOURISTINFO_ID)
)

通过使用 约束名称定义,外键被显式命名,否则 H2 会根据它自己的命名方案为其分配一个名称,例如 CONSTRAINT_74。

我觉得这可以通过避免名称使用的歧义和引用之前直接定义的名称来让以后管理约束更加安全,例如

ALTER TABLE PLANETICKETS DROP CONSTRAINT FK_PLANETICKET_TOURIST;
ALTER TABLE PLANETICKETS ADD CONSTRAINT FK_PLANETICKET_TOURIST FOREIGN KEY (TOURISTINFO_ID) REFERENCES TOURISTINFO(TOURISTINFO_ID)  ON DELETE CASCADE;

基于我对可安装软件产品的 Flyway 的使用,我已经开始将其作为标准操作。

从理论上讲,Flyway 迁移的顺序应该导致以相同的顺序应用约束(包括外键),因此 H2 应该在每个数据库副本中分配相同的名称。但是,如果分配了直接名称(在以前的迁移脚本中引用的名称)而不是通过检查单个数据库实例中分配的名称推断出的名称,则担心点会被消除。

原文由 Dazed 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进