mysql-添加复合主键将删除索引

时间:2018-11-07 13:30:47

标签: mysql sql database foreign-keys primary-key

我在将复合主键添加到现有表时遇到问题。添加pk可以,但是在向下迁移中将其删除会失败。

我有users_companies表,连接users表和company表。 users_companies表由两列userId和companyId组成,它们当然都是外键。我的问题是此表没有主键。当我使用ALTER TABLE users_companies ADD PRIMARY KEY(userId, companyId)添加主键时,一切似乎都可以正常工作。但是,一旦我尝试撤消该主键(用于迁移回滚),就会出现以下错误:

  

将'./db_name/#sql-1_9'重命名为错误   './db_name/users_companies'(错误号:150-外键约束   格式不正确)

这意味着我无法删除用于迁移回滚的PK。

过一会儿,我注意到添加主键会删除fk索引users_companies.userId。再次手动添加该索引使PK删除再次起作用。尽管如此,创建主键时并不会始终删除该索引(这取决于我使用的数据库),因此添加PK后我无法简单地重新创建索引。如果我复制其中包含数据的当前数据库并尝试运行迁移,则不会删除索引,并且会收到错误消息,我试图添加已经存在的索引。但是,在测试数据库中,该数据库在每次测试运行时都会重新创建,并且为空(仅包含一些种子数据),因此删除了索引。

因此,除非重新创建索引,否则我无法在创建PK后将其删除,但是由于并非总是将其删除,因此无法将索引重新创建添加到迁移中。

我猜这里有些严重错误,因此,如果缺少索引,则添加索引仅仅是无法解决此处实际问题的解决方法。

1 个答案:

答案 0 :(得分:0)

我建议将此 not 用作表的主键。只需创建一个自动递增字段作为PK。然后,如果您需要经常使用它来查找数据,请在这对字段上创建索引。 UNIQUE索引(如有必要)。

一般而言,良好的数据库设计原则之一是主键不应包含信息:它们的唯一目的是明确标识行。 PK应该完全没有“意义”。