MariaDB создает ошибку при выдаче таблицы при нарушении внешнего ключа - PullRequest
0 голосов
/ 09 апреля 2020

Выполнение следующих операторов SQL (в этом порядке) приводит к появлению следующей ошибки, я понятия не имею, что не так, искал в Google примеры запросов и все они мне кажутся одинаковыми.

Они отлично работает при выполнении на сервере MySQL Workbench, но не при попытке его на сервере MariaDb.

Ошибка:

com. mysql .jdb c .exceptions.jdbc4.MySQLSyntaxErrorException: у вас есть ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MariaDB, на предмет правильного синтаксиса, который можно использовать рядом с 'CONSTRAINT playerid FOREIGN KEY (playerid). заявления:

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
);

1 Ответ

0 голосов
/ 09 апреля 2020

Возможно, вы используете версию 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 для столбца первичного ключа Первый стол Первичный ключ уже уникален. Я тоже это прокомментировал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...