Что вызывает ошибку MySQL 1071 (слишком длинный ключ) в этом случае? - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть следующая таблица, закодированная в utf8mb4:

CREATE TABLE IF NOT EXISTS `account` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `customer_id` INT UNSIGNED NOT NULL,
  `name` VARCHAR(45) NOT NULL,
  `username` VARCHAR(254) NOT NULL,
  `password` CHAR(60) NOT NULL,
  PRIMARY KEY (`id`),
  INDEX `fk_table1_customer_idx` (`customer_id` ASC),
  UNIQUE INDEX `unique_account` (`customer_id` ASC, `username` ASC),
  CONSTRAINT `fk_table1_customer`
    FOREIGN KEY (`customer_id`)
    REFERENCES `customer` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB
ROW_FORMAT = DYNAMIC;

Мне нужно добавить к ней логический столбец, так что вот что я делаю:

ALTER TABLE `account` 
    ADD COLUMN `is_customer_admin`
        INT(4) NOT NULL DEFAULT 0
        AFTER `customer_id`;

Я такжепопытался добавить столбец BOOLEAN вместо INT(4)

Однако я получаю сообщение об ошибке:

ОШИБКА 1071 (42000): указанный ключ слишком длинный;максимальная длина ключа составляет 767 байт

Впервые я сталкиваюсь с такой ошибкой.Я нашел несколько вопросов об этой конкретной ошибке, однако сам не смог применить ее к своей ситуации.

С этот вопрос Я понимаю, что username может быть слишком длинным, но потомЯ не понимаю, как они создали эту таблицу в первую очередь.Мой запрос не касается этого поля.

1 Ответ

0 голосов
/ 15 ноября 2018

В старых версиях MySQL / MariaDB максимально допустимая длина ключа (индекса) составляет 767 байт . От Документы :

По умолчанию ограничение длины префикса ключа индекса составляет 767 байтов. Например, вы можете установить этот предел с индексом префикса столбца более 255 символов в столбце TEXT или VARCHAR, предполагая набор символов utf8mb3 и максимум 3 байта для каждого символа. Когда опция конфигурации innodb_large_prefix включена, ограничение длины префикса ключа индекса увеличивается до 3072 байтов для таблиц InnoDB, которые используют формат строки DYNAMIC или COMPRESSED.

Теперь проблема в вашем случае еще более возрастает, так как вместо этого вы используете набор символов utf8mb4. Это означает 4 байта (не 3 байта) на символ.

`username` VARCHAR(254)

Это будет означать 254 * 4 = 1016 байт, что определенно превышает лимит. Вам нужно будет уменьшить максимальное количество символов, указанное для столбца username.

Кроме того, следующее ограничение не имеет особого смысла, так как customer_id уже является Первичным ключом.

UNIQUE INDEX `unique_account` (`customer_id` ASC, `username` ASC)

От этого тоже можно избавиться.

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