我在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))的新外键约束

  • 但是,在这一点上,我建议您在这里重新考虑表设计。您在id表上只有一个主键postitem,通常,IMO应该是参考外键约束的更好选择。即我建议您:
  • DROP上面引用表上的外键约束
  • 删除这些表中的post_category_iditem_name
  • 而是将新列postitemid bigint(20)添加到这些表
  • 创建一个新的FOREIGN KEY约束,从otherTable.postitemidpostitem(id)

  • 显然,这现在可能会对系统的其余部分产生巨大影响。

    简单的代理键(例如AUTO_INCREMENT INTs)的主要优点之一是它们对更改的适应性更强,我想我们已经在这里证明了这一点。

    关于mysql - 将列添加到现有的唯一键?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29862128/

    10-10 01:02