我在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
。我怎么能这样做?
答案 0 :(得分:0)
您可以删除现有约束,然后使用新字段重新创建它。 我建议同时将它重命名为更合适的东西:
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
。因此,对于每个这样的引用表,您将需要
createdBy_id
列(相同类型)现在你可以
postitem
postitem
上添加新的唯一键约束
再次为每个引用表
postitem(post_category_id, item_name, createdBy_id))
但是,此时我建议你在这里重新考虑你的桌面设计。您在id
表上有一个主键postitem
,IMO通常更适合引用外键约束。也就是说,我建议你:
post_category_id
和item_name
postitemid bigint(20)
otherTable.postitemid
到postitem(id)
显然,这可能会对您系统的其他部分产生巨大影响。
简单代理键(如AUTO_INCREMENT INTs
)的主要好处之一是它们对变化更具弹性,我想我们刚刚在这里证明了这一点。