繁体   English   中英

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

[英]mysql - adding composite primary key removes index

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

我有users_companies表,连接users表和companys表。 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后将其删除,但是由于并非总是将其删除,因此无法将索引重新创建添加到迁移中。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM