MariaDB не позволит мне сделать колонку уникальной - PullRequest
2 голосов
/ 20 марта 2020

Я недавно продублировал существующую таблицу MariaDB (для использования в Amazon RDS). Эти две таблицы в основном идентичны, включая данные, но я заметил, что в новой версии отсутствовали все уникальные ограничения (первичные ключи сохранялись очень хорошо). Когда я попытался добавить уникальные записи, я получил сообщение об ошибке:

BLOB/TEXT column 'url' used in key specification without a key length

У других возникла эта проблема, и люди заявили , что MySQL / MariaDB просто не позволяет вам сделать текстовые столбцы уникальны. Но моя оригинальная база данных MariaDB (на моей локальной машине) содержит множество текстовых столбцов с уникальными ключами, так что этого не может быть. В любом случае, я попробовал их решение (переход на varchar), но MariaDB тоже не позволила бы мне сделать это, потому что в моих данных слишком много символов. Любые идеи? Большое спасибо.

1 Ответ

2 голосов
/ 20 марта 2020

MariaDB 10.4 поддерживает UNIQUE KEY для столбца TEXT, поскольку он автоматически преобразует индекс в индекс HA SH:

mysql> create table t (id serial primary key, t text, unique key(t));
Query OK, 0 rows affected (0.01 sec)

mysql> show create table t\G
*************************** 1. row ***************************
       Table: t
Create Table: CREATE TABLE `t` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `t` text DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `t` (`t`) USING HASH
) ENGINE=InnoDB DEFAULT CHARSET=latin1

К сожалению, Amazon RDS для MariaDB пока не поддерживает MariaDB 10.4 (поскольку от 2020-03-19), в соответствии с https://aws.amazon.com/rds/mariadb/:

Amazon RDS поддерживает MariaDB Server версий 10.0, 10.1, 10.2 и 10.3, что означает, что код, приложения и инструменты, которые вы уже используете сегодня, можно использовать с Amazon RDS.

Функция индекса HA SH не поддерживается в MariaDB 10.3 или более ранних версиях:

mysql> create table t (id serial primary key, t text, unique key(t));
ERROR 1170 (42000): BLOB/TEXT column 't' used in key specification without a key length

Вы можете создать уникальный ключ для префикса текстового столбца:

mysql> create table t (id serial primary key, t text, unique key(t(1000)));
Query OK, 0 rows affected (0.01 sec)

mysql> show create table t\G
*************************** 1. row ***************************
       Table: t
Create Table: CREATE TABLE `t` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `t` text DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `t` (`t`(1000))
) ENGINE=InnoDB DEFAULT CHARSET=latin1

Это означает, что уникальный ключ обеспечит уникальность первых 1000 символов. Вам не разрешено хранить две строки со строкой, которые имеют одинаковые первые 1000 символов, но отличаются 1001-м символом или более поздним.

...