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
索引。主键已经是唯一的。我也评论了。
运行 以下 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
索引。主键已经是唯一的。我也评论了。