不让我让专栏变得独一无二 [英] MariaDB won't let me make column unique

查看:0
本文介绍了不让我让专栏变得独一无二的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我最近复制了一个现有的MariaDB表(用于Amazon RDS)。这两个表基本相同,包括数据,但我注意到新版本缺少所有唯一约束(保持主键良好)。当我尝试添加回唯一性时,收到错误:

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

其他人也遇到过这个问题,人们claimed认为MySQL/MariaDB不允许您使文本列唯一。但是我原来的MariaDB数据库(在我的本地机器上)有大量具有唯一键的文本列,所以这不可能。我还是尝试了他们的解决方案(切换到varchar),但MariaDB也不允许我这样做,因为我的数据包含太多字符。有什么主意吗?非常感谢。

推荐答案

MariaDB10.4支持文本列上的唯一键,因为它会自动将索引转换为散列索引:

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 tG
*************************** 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 for MariaDB目前还不支持MariaDB 10.4(截至2020-03-19),根据https://aws.amazon.com/rds/mariadb/

Amazon RDS支持MariaDB服务器版本10.0、10.1、10.2和10.3,这意味着您现在已经使用的代码、应用程序和工具可以与Amazon RDS一起使用。

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 tG
*************************** 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个字符相同、但第100个字符或更高字符不同的两行字符串。

这篇关于不让我让专栏变得独一无二的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆