MariaDB create table 在外键约束上抛出错误

MariaDB create table throws error on foreign key contraint

运行 以下 SQL 语句(按此顺序)导致抛出以下错误,我不知道出了什么问题,搜索了 Google 示例查询,所有这些似乎我也一样。

它们在 MySQL Workbench 服务器上执行时工作正常,但当我在 MariaDb 服务器上执行时却不行。

错误:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ' CONSTRAINT playerid FOREIGN KEY (playerid) REFERENCES st_player (id) ON DELET' at line 1

SQL 语句:

CREATE TABLE IF NOT EXISTS `st_player` (
    `id` VARCHAR(45) NOT NULL, 
    `playerName` VARCHAR(45) NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `id` (`id`)
);

CREATE TABLE IF NOT EXISTS `st_statistic` (
    `criteria` VARCHAR(45) NOT NULL, 
    `subcriteria` VARCHAR(45) NOT NULL, 
    `playerid` VARCHAR(45) NOT NULL, 
    `displayname` VARCHAR(45) NULL,
    `amount` INT NULL, 
    PRIMARY KEY (`criteria`, `subcriteria`, `playerid`), 
    INDEX `playerid_idx` (`playerid` ASC) VISIBLE, 
    CONSTRAINT `playerid` 
        FOREIGN KEY (`playerid`) REFERENCES `st_player` (`id`) 
        ON DELETE CASCADE 
        ON UPDATE NO ACTION
);

您可能是 运行 不支持不可见索引功能的 MySQL 版本。 VISIBLE 无论如何都是默认行为,因此您可以将其从 create table 语句中删除。

此外,MySQL 自动在外键列上创建索引;这意味着您实际上不需要显式声明该索引。因此,我建议只删除索引声明。

这段代码运行良好:

CREATE TABLE IF NOT EXISTS st_player(
    id VARCHAR(45) NOT NULL,
    playerName VARCHAR(45) NOT NULL, 
    PRIMARY KEY (id)
    -- UNIQUE KEY id(id)
);

CREATE TABLE IF NOT EXISTS st_statistic(
    criteria VARCHAR(45) NOT NULL,
    subcriteria VARCHAR(45) NOT NULL,
    playerid VARCHAR(45) NOT NULL,
    displayname VARCHAR(45) NULL,
    amount INT NULL, 
    PRIMARY KEY (criteria,subcriteria,playerid), 
    -- INDEX playerid_idx(playerid ASC), -- unnecessary (but it it is OK if you uncomment it)
    CONSTRAINT playerid
        FOREIGN KEY (playerid) REFERENCES st_player(id) 
        ON DELETE CASCADE 
        ON UPDATE NO ACTION
);

另请注意,第一个 table 的主键列不需要 unique 索引。主键已经是唯一的。我也评论了。