我在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
列。因此,对于每个此类引用表,您都需要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
)的主要优点之一是它们对更改的适应性更强,我想我们已经在这里证明了这一点。关于mysql - 将列添加到现有的唯一键?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29862128/