【问题标题】:MariaDB won't let me make column uniqueMariaDB 不允许我使列独一无二
【发布时间】:2020-03-19 21:44:01
【问题描述】:

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

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

其他人也遇到过这个问题,人们有claimed 表示 MySQL/MariaDB 根本不允许您使文本列独一无二。但是我原来的 MariaDB 数据库(在我的本地机器上)有很多带有唯一键的文本列,所以不可能。无论如何,我尝试了他们的解决方案(切换到 varchar),但 MariaDB 也不允许我这样做,因为我的数据有太多字符。有任何想法吗?非常感谢。

【问题讨论】:

  • 两台服务器是否安装了相同版本的 MySQL?如果它们不同,则可能一个版本允许这样做,而另一个版本则不允许
  • 一个在我的本地机器上运行(一个工作),一个在 Amazon RDS 上(一个不工作)
  • 是的,本地的 MySQL 版本与在 AWS 上运行的 MySQL 版本是什么?在每个数据库上运行 SELECT VERSION(); 并比较返回的内容
  • 啊,它们不同:本地:10.4.11-MariaDB。 Amazon RDS:10.2.21-MariaDB-log。嗯,那我该怎么办?我可以更新 Amazon 的版本,或者更改表以使用旧的 MariaDB,或者其他什么?
  • 好吧,您可以将不起作用的版本更改为与起作用的版本相同,这可能会有所帮助。我不知道您从哪里获得将其更改为 VARCHAR 的说明,但查看此链接说,如果您没有正确设置密钥长度,VARCHAR 解决方案可能无法正常工作。 techjourney.net/…

标签: mariadb amazon-rds


【解决方案1】:

MariaDB 10.4 支持 TEXT 列上的 UNIQUE KEY,因为它会自动将索引转换为 HASH 索引:

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 for MariaDB 尚不支持 MariaDB 10.4(截至 2020 年 3 月 19 日),https://aws.amazon.com/rds/mariadb/

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

MariaDB 10.3 或更早版本不支持 HASH 索引功能:

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 个字符或更高字符不同的字符串的两行。

【讨论】:

  • 这听起来很有希望!不过有点困惑:看起来我不应该像更改表格那样创建那么多东西,对吧?我一直在使用数据库工具(dBeaver),所以我对 Mariadb 语法不是很熟悉。
  • 这似乎行得通!原来我的语法有错别字。
  • @codi6 很高兴听到 Bill Karwin 的回答有效。你将他的回答标记为已接受,但如果我是你,我也会赞成他的回答。
  • @BillKarwin - 你在手册中有关于这个新的 10.4 功能的参考吗?我在手册和更改日志中找不到它。
猜你喜欢
  • 1970-01-01
  • 2019-03-30
  • 2011-09-27
  • 2014-03-07
  • 1970-01-01
  • 1970-01-01
  • 2015-12-22
  • 2017-04-06
  • 1970-01-01
相关资源
最近更新 更多