mysql之将列添加到现有的唯一键

over140 阅读:69 2024-04-30 13:58:09 评论:0

我在 mysql 中创建了下表。

 CREATE TABLE `postitem` ( 
  `id` bigint(20) NOT NULL AUTO_INCREMENT, 
  `createdAt` datetime DEFAULT NULL, 
  `item_name` varchar(255) NOT NULL, 
  `createdBy_id` bigint(20) NOT NULL, 
  `post_category_id` bigint(20) NOT NULL, 
  PRIMARY KEY (`id`), 
  UNIQUE KEY `UK_4cscn0qw8u7go5hvmofq0ersg` (`post_category_id`,`item_name`), 
  KEY `FK_ncg8dotnqoetaiem6hiokvpwy` (`createdBy_id`), 
  CONSTRAINT `FK_ncg8dotnqoetaiem6hiokvpwy` FOREIGN KEY (`createdBy_id`) REFEREN                                                                                                                     CES `applicationuser` (`id`), 
  CONSTRAINT `FK_nfh1xw0eqqu9wg5hhl7iqdk56` FOREIGN KEY (`post_category_id`) REF                                                                                                                     ERENCES `postcategory` (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=737 DEFAULT CHARSET=utf8 | 

现在我需要再添加一列 createdBy_idUNIQUE KEY。我该怎么做?

请您参考如下方法:

您可以删除现有约束,然后使用新字段重新创建它。 我建议同时将其重命名为更合适的名称:

ALTER TABLE `postitem` DROP INDEX `UK_4cscn0qw8u7go5hvmofq0ersg`; 
ALTER TABLE `postitem` ADD CONSTRAINT `UK_Post_Item_CreatedBy`  
   UNIQUE (`post_category_id`,`item_name`, `createdBy_id`); 

编辑:重新外键约束

由于您正在更改约束的唯一性,所有通过上述 UKC 引用您的 postitem 表的表现在都需要重新建模以适应新列 createdBy_id 同样。因此,对于每个这样的引用表,您都需要

  • 删除 FOREIGN KEY 约束
  • 添加新的 createdBy_id 列(相同类型)

现在你可以

  • 删除 postitem 上的唯一键约束
  • 在带有额外列的 postitem 上添加新的唯一键约束

再次为每个引用表

  • 添加一个新的外键约束引用 postitem(post_category_id, item_name, createdBy_id))

但是,此时我建议您重新考虑此处的表格设计。 postitem 表上有一个主键 id,IMO 通常更适合引用外键约束。也就是说,我建议您:

  • 如上删除引用表的外键约束
  • 删除这些表中的列 post_category_iditem_name
  • 相反,向这些表中添加一个新列 postitemid bigint(20)
  • 创建一个新的 FOREIGN KEY 约束,从 otherTable.postitemidpostitem(id)

显然,这现在可能会对您系统的其余部分产生巨大影响。

简单代理键(如 AUTO_INCREMENT INTs)的主要好处之一是它们更能适应变化,我想我们刚刚在这里证明了这一点。


标签:mysql
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号