将列添加到现有唯一键?

时间:2015-04-25 07:02:41

标签: 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 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。我怎么能这样做?

1 个答案:

答案 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。因此,对于每个这样的引用表,您将需要

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

现在你可以

  • 删除postitem
  • 上的唯一键约束
  • 使用额外列
  • postitem上添加新的唯一键约束

再次为每个引用表

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

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

  • 按上述方式删除引用表的外键约束
  • 在这些表格中删除列post_category_iditem_name
  • 而是向这些表添加新列postitemid bigint(20)
  • otherTable.postitemidpostitem(id)
  • 创建新的FOREIGN KEY约束

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

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