Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 是否将列添加到现有的唯一键?_Mysql_Sql - Fatal编程技术网

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

我在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
。如何执行此操作?

您可以删除现有约束,然后使用新字段重新创建它。 我建议同时将其重命名为更合适的名称:

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)
,这将阻止您更改约束。