【问题标题】:Does h2 support creating table with secondary key?h2 是否支持使用辅助键创建表?
【发布时间】:2016-07-31 07:17:31
【问题描述】:

h2是否支持用二级键建表?

当我尝试创建表时,它失败并显示“org.h2.jdbc.JdbcSQLException:未知数据类型:”(“;SQL 语句:”

CREATE TABLE IF NOT EXISTS testTable
    (col1 BIGINT(20) NOT NULL AUTO_INCREMENT,
    col2 BIGINT(20) NOT NULL,
    col3 BIGINT(20) NOT NULL,
    col4 VARCHAR(100) NOT NULL,
    PRIMARY KEY(col1),
    KEY(col1, col2, col3));

但是这个成功了:

CREATE TABLE IF NOT EXISTS testTable
    (col1 BIGINT(20) NOT NULL AUTO_INCREMENT,
    col2 BIGINT(20) NOT NULL,
    col3 BIGINT(20) NOT NULL,
    col4 VARCHAR(100) NOT NULL,
    PRIMARY KEY(col1));

【问题讨论】:

    标签: sql h2 ddl secondary-indexes


    【解决方案1】:

    KEY 是 MySQL 特有的语法:

    KEY(col1, col2, col3)
    

    您正在寻找的是 UNIQUE 约束,例如

    CREATE TABLE IF NOT EXISTS testTable (
        col1 BIGINT(20) NOT NULL AUTO_INCREMENT,
        col2 BIGINT(20) NOT NULL,
        col3 BIGINT(20) NOT NULL,
        col4 VARCHAR(100) NOT NULL,
        PRIMARY KEY (col1),
        UNIQUE (col1, col2, col3)
    );
    

    注意,我通常喜欢为我的约束命名,因为这样可以方便以后查找/删除它们:

    CREATE TABLE IF NOT EXISTS testTable (
        col1 BIGINT(20) NOT NULL AUTO_INCREMENT,
        col2 BIGINT(20) NOT NULL,
        col3 BIGINT(20) NOT NULL,
        col4 VARCHAR(100) NOT NULL,
        CONSTRAINT primary_key PRIMARY KEY (col1),
        CONSTRAINT secondary_key UNIQUE (col1, col2, col3)
    );
    

    如果您不是在寻找独特性

    有趣的是(正如 cmets 中所指出的),MySQL 使用术语 KEY 表示非唯一索引。在大多数数据库(包括 MySQL)中,您只需为这种情况创建一个索引:

    CREATE INDEX secondary_index ON testTable(col1, col2, col3);
    

    【讨论】:

    • 如果你只想要一个普通索引(没有列组合的约束是唯一的),你也可以使用 INDEX 而不是 mysql 特定的 KEY
    • @nos:好点。我忘记了这个有趣的 MySQL 解释 KEY 是什么
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-15
    • 2012-08-12
    • 1970-01-01
    相关资源
    最近更新 更多