【问题标题】:MariaDB create table throws error on foreign key contraintMariaDB 创建表在外键约束上抛出错误
【发布时间】:2020-04-09 09:51:14
【问题描述】:

运行以下 SQL 语句(按此顺序)会引发以下错误,我不知道出了什么问题,在 Google 上搜索了示例查询,对我来说似乎都是一样的。

在 MySQL Workbench 服务器上执行时它们运行良好,但在 MariaDb 上运行时却不行。

错误:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 你的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在第 1 行的“CONSTRAINT playerid FOREIGN KEY (playerid) REFERENCES st_player (id) ON DELET”附近使用正确的语法

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 关键字仅适用于 8+ 版本。
  • 在考虑发布之前,请阅读手册和谷歌任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有和没有您的特定字符串/名称和站点:stackoverflow.com &标签;阅读许多答案。如果您发布问题,请使用一个短语作为标题。反映你的研究。请参阅How to Ask 和投票箭头鼠标悬停文本。

标签: mysql sql foreign-keys mariadb create-table


【解决方案1】:

您可能正在运行不支持不可见索引功能的 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
);

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

【讨论】:

    猜你喜欢
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多