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_id
到 UNIQUE 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_id
和item_name
- 相反,向这些表中添加一个新列
postitemid bigint(20)
- 创建一个新的 FOREIGN KEY 约束,从
otherTable.postitemid
到postitem(id)
显然,这现在可能会对您系统的其余部分产生巨大影响。
简单代理键(如 AUTO_INCREMENT INTs
)的主要好处之一是它们更能适应变化,我想我们刚刚在这里证明了这一点。
声明
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。