Mysql 是否将列添加到现有的唯一键?
我在mysql中创建了下表Mysql 是否将列添加到现有的唯一键?,mysql,sql,Mysql,Sql,我在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 KE
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
。如何执行此操作?您可以删除现有约束,然后使用新字段重新创建它。
我建议同时将其重命名为更合适的名称:
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引用您的positem
表的所有表现在都需要重新建模,以适应新列createdBy_id
。因此,对于每个这样的引用表,您需要
- 删除外键约束
- 添加新的
列(相同类型)createdBy_id
- 在
positem
- 在带有额外列的
上添加新的唯一键约束positem
- 添加一个新的外键约束,引用
positem(post\u category\u id、item\u name、createdBy\u id))
positem
表上有一个主键id
,IMO通常是外键约束引用的更好的候选者。i、 e.我建议您:
- 如上所述,删除引用表上的外键约束
- 在这些表中删除列
和post\u category\u id
item\u name
- 相反,在这些表中添加一个新列
positemid bigint(20)
- 从
到otherTable.positemid
positem(id)
简单代理键(如
AUTO_INCREMENT INTs
)的一个主要优点是它们更能适应变化,我想我们已经在这里证明了这一点。createdBy_id已经是一个column,您想要另一个同名的吗?我想要createdBy_id与其他两列一起成为唯一约束的一部分。我尝试了。但它给出了一个错误:错误代码:1553无法删除索引“uk4cscn0qw8u7go5hvmofq0ersg”:外键约束中需要您说的“添加新的createdBy_id列(相同类型)”。在引用此约束的所有表中,我需要在哪个表中添加?@user755806。这是您需要的TABLE\u NAME
输出列。非常感谢您的回答。但是我不明白为什么引用表中需要createdBy_id?您继承了一个有点混乱的设计-大多数情况下,您希望所有引用表在外键约束上使用表主键。但是,在这种情况下,有人决定将外键添加到positem(post\u category\u id,item\u name)
,这将阻止您更改约束。