在 MySQL 和 H2 中删除唯一约束

Posted

技术标签:

【中文标题】在 MySQL 和 H2 中删除唯一约束【英文标题】:Drop unique constraint in MySQL and H2 【发布时间】:2015-05-07 01:50:34 【问题描述】:

我在 CREATE 语句中有以下约束:

UNIQUE (`field_name`)

这些删除约束的命令在 mysql 中有效,但在 H2 中无效:

DROP INDEX `field_name` ON `table_name`;    
ALTER TABLE `table_name` DROP INDEX `field_name`;

我需要一个在 MySQL 和 H2 中都可以使用的命令(MySQL 用于真实环境,H2 用于单元测试)

【问题讨论】:

你解决了这个问题吗? 查看下面的解决方法 【参考方案1】:

找到以下解决方法:删除列删除约束,因此:

ALTER TABLE `table_name` ADD COLUMN `tmp_code` VARCHAR(50) NOT NULL DEFAULT 'TMP';

UPDATE `table_name`
SET `tmp_code` = `field_name`;

ALTER TABLE `table_name` DROP COLUMN `field_name`;

ALTER TABLE `table_name` ADD COLUMN `field_name` VARCHAR(50) NOT NULL;

UPDATE `table_name`
SET `field_name` = `tmp_code`;

ALTER TABLE `table_name` DROP COLUMN `tmp_code`;

【讨论】:

【参考方案2】:

执行 SHOW CREATE TABLE 以查看 UNIQUE KEY 的名称。然后您可以继续使用 DROP 或 ALTER。它可能会说

UNIQUE KEY `col` (`col`),

第一个col 是键名。

如果您需要维护 INDEX 但摆脱 UNIQUEness 约束,则删除键,然后添加非唯一键。

【讨论】:

对于尝试在不同连接(例如 IntelliJ 控制台)上执行查询的其他人,这将不起作用,因为 H2 In-Memory 数据库会在每个连接上创建唯一的数据库。请参阅this 了解更多信息。 @Flavalacious - 所以这是一个 H2 问题?也许亚历山大有正确的答案? 看起来是这样。正如documentation 所建议的那样,我对原生H2 commands 进行了一些挖掘,看起来它本质上是不同的。错误消息也确实指出了相同的错误区域(注意消息上的[*])。如果有帮助,我很乐意稍后在另一个答案中详细说明,因为对 H2 数据库进行彻底检查会有点乏味。

以上是关于在 MySQL 和 H2 中删除唯一约束的主要内容,如果未能解决你的问题,请参考以下文章

mysql中唯一约束、key和索引的区别,unique key 就是唯一约束吗,新手麻烦指点,谢谢

在 H2 中切换同一事务中的两个唯一字段时违反唯一约束

MySQL增加查看删除唯一性约束

mysql中删除已有字段的唯一性约束?

「MySQL」- 约束详解

H2数据库:仅对非NULL值的唯一约束? (过滤索引)