在MySQL和H2中删除唯一约束

3

我在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用于单元测试)。

你解决了这个问题吗? - Piotr Sobolewski
请参见下面的解决方法。 - Alexander
2个回答

2
发现以下解决方法:删除列会移除约束,因此:
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`;

0

执行 SHOW CREATE TABLE 命令以查看唯一键的名称。然后您可以继续进行 DROP 或 ALTER 操作。它可能会显示:

UNIQUE KEY `col` (`col`),

第一个col是键名。

如果您需要保留索引但去除唯一性约束,则删除该键,然后添加非唯一键。


对于那些试图在不同连接上执行查询(例如 IntelliJ 控制台)的其他人,这是行不通的,因为 H2 In-Memory 数据库会在每个连接上创建唯一的数据库。有关更多信息,请参见此处 - Achmad Afriza
@Flavalacious - 所以这是一个H2的问题?也许Alexander有正确的答案? - Rick James
看起来是这样。我通过本地H2 命令进行了一些挖掘,它看起来与文档中所建议的不同。错误消息也指出了相同的错误区域(请注意消息上的[*])。如果有帮助的话,我很乐意在另一个答案中详细说明,因为对H2数据库进行彻底检查会有点繁琐。 - Achmad Afriza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接