h2 sql,用多列主键创建表?

Posted

技术标签:

【中文标题】h2 sql,用多列主键创建表?【英文标题】:h2 sql, create table with multi-column primary key? 【发布时间】:2012-03-27 23:17:00 【问题描述】:

如何使用 h2 数据库在 CREATE TABLE 语句中创建多列主键? 根据我的调查,在 mysql 和 Apache Derby 数据库中执行此操作的代码是:

CREATE TABLE SAMP.SCHED(
    CLASS_CODE CHAR(7) NOT NULL, 
    DAY SMALLINT NOT NULL, 
    STARTING TIME, 
    ENDING TIME,
    PRIMARY KEY (CLASS_CODE, DAY));

但这在 h2 中不起作用,它会导致 'org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement'

非常感谢任何帮助。谢谢

【问题讨论】:

如果我正确理解了文档 (h2database.com/html/grammar.html#constraint),那么您的 PRIMARY KEY 声明没有任何问题 - 该声明是否可能还有其他问题? 您发布的语句对我有用(当我针对 H2 数据库运行时没有语法错误)。 哦,亲爱的,你是对的,我在我的代码中遗漏了最后一个括号,所以有一个未闭合的括号。对不起,伙计们,这是一个非常愚蠢的错误。为麻烦道歉。可惜 IDE 不解析 SQL 字符串并检查类似的东西。 我认为SQL语句不应该是字符串,而是应该在编程语言本身中指定SQL语句。这将使此类问题无效,而且会使代码注入变得不可能。这就是我启动 H2 子项目 JaQu 的原因。 【参考方案1】:

从这里开始:

http://www.razorsql.com/features/h2_add_primary_key.html

这应该可行:

ALTER TABLE SAMP.SCHED ADD PRIMARY KEY (CLASS_CODE, DAY)

【讨论】:

不错!感谢您的快速回复 icyrock,这行得通。尽管如此,还是很奇怪,在 CREATE TABLE 语句中没有明显的方法来做到这一点。 CREATE TABLE(..., PRIMARY KEY(CLASS_CODE, DAY)) 适用于 H2 数据库。运行语句时一定有其他问题。 你是对的,谢谢托马斯。为我的愚蠢道歉。我刚刚意识到你是 H2 背后的工程师。这是一个很棒的项目,教程很棒(h2database.com/html/tutorial.html#web_applications),其他数据库项目都没有如此全面的指南或易于使用的可双击 jar 文件。

以上是关于h2 sql,用多列主键创建表?的主要内容,如果未能解决你的问题,请参考以下文章

在SQL SERVER 中对表不能设置主键

mysql表中一个表中可以有多个主键吗

SQL-- 主键

Sql Server 主键 外键约束

SQL 数据库主键 ,外键

快速 SQL 问题:在 H2 中创建具有主键的表的正确语法?