MySQL: ERROR 1553 (HY000): Cannot drop index ‘uniq_profit’: needed in a foreign key constraint

1
2
3
  UNIQUE KEY `uniq_profit` (`sales_id`,`accounting_status`),
  CONSTRAINT `costs_profit_sales_id_d56dec15_fk_sales_sales_id` FOREIGN KEY (`sales_id`) REFERENCES `sales_sales` (`id`),
  CONSTRAINT `costs_profit_chk_1` CHECK ((`fiscal_year` >= 0))
1
2
ALTER TABLE `costs_profit` DROP FOREIGN KEY `costs_profit_sales_id_d56dec15_fk_sales_sales_id`, DROP INDEX `uniq_profit`;
ALTER TABLE `costs_profit` ADD CONSTRAINT `costs_profit_sales_id_d56dec15_fk_sales_sales_id` FOREIGN KEY (`sales_id`) REFERENCES `sales_sales` (`id`);

実行:

1
2
3
4
5
6
7
mysql> ALTER TABLE `costs_profit` DROP FOREIGN KEY `costs_profit_sales_id_d56dec15_fk_sales_sales_id`, DROP INDEX `uniq_profit`;
Query OK, 0 rows affected (0.20 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE `costs_profit` ADD CONSTRAINT `costs_profit_sales_id_d56dec15_fk_sales_sales_id` FOREIGN KEY (`sales_id`) REFERENCES `sales_sales` (`id`);
Query OK, 16 rows affected (0.17 sec)
Records: 16  Duplicates: 0  Warnings: 0

Django Migration の失敗

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
from django.db import migrations, models


class Migration(migrations.Migration):

    dependencies = [
        ('partners', '0003_auto_20230426_0908'),
    ]

    operations = [
        migrations.RemoveConstraint(
            model_name='partneruserrole',
            name='uniq_partneruserrole',
        ),
        migrations.AddConstraint(
            model_name='partneruserrole',
            constraint=models.UniqueConstraint(fields=('partner', 'partneruser', 'permission'), name='uniq_partneruserrole'),
        ),
    ]

制約 検索

1
2
3
4
5
6
7
8
9
SELECT DISTINCT A.CONSTRAINT_NAME, A.TABLE_NAME, A.COLUMN_NAME, B.CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE as A
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE as B
ON A.TABLE_NAME = B.TABLE_NAME
WHERE
    A.TABLE_NAME = 'partners_partneruserrole'
    AND B.CONSTRAINT_NAME  like 'uniq_%'
    AND A.CONSTRAINT_NAME  not like 'uniq_%'
    AND A.CONSTRAINT_NAME != 'PRIMARY';
+-----------------------------------------------------------+--------------------------+----------------+----------------------+
| CONSTRAINT_NAME                                           | TABLE_NAME               | COLUMN_NAME    | CONSTRAINT_NAME      |
+-----------------------------------------------------------+--------------------------+----------------+----------------------+
| partners_partneruser_partneruser_id_d59f67cc_fk_partners_ | partners_partneruserrole | partneruser_id | uniq_partneruserrole |
| partners_partneruser_partner_id_852ab185_fk_partners_     | partners_partneruserrole | partner_id     | uniq_partneruserrole |
| partners_partneruser_permission_id_031e3996_fk_auth_perm  | partners_partneruserrole | permission_id  | uniq_partneruserrole |
+-----------------------------------------------------------+--------------------------+----------------+----------------------+

再設定

1
2
3
4
5
6
7
ALTER TABLE `partners_partneruserrole` DROP FOREIGN KEY `partners_partneruser_partneruser_id_d59f67cc_fk_partners_`;
ALTER TABLE `partners_partneruserrole` DROP FOREIGN KEY `partners_partneruser_partner_id_852ab185_fk_partners_`;
ALTER TABLE `partners_partneruserrole` DROP FOREIGN KEY `partners_partneruser_partner_id_852ab185_fk_partners_`, DROP INDEX `uniq_profit`;

ALTER TABLE `partners_partneruserrole` ADD CONSTRAINT `partners_partneruser_partneruser_id_d59f67cc_fk_partners_` FOREIGN KEY (`partneruser_id`) REFERENCES `partners_partneruser` (`id`);
ALTER TABLE `partners_partneruserrole` ADD CONSTRAINT `partners_partneruser_partner_id_852ab185_fk_partners_` FOREIGN KEY (`partner_id`) REFERENCES `partners_partner` (`id`);
ALTER TABLE `partners_partneruserrole` ADD CONSTRAINT `partners_partneruser_permission_id_031e3996_fk_auth_perm` FOREIGN KEY (`permission_id`) REFERENCES `auth_permission` (`user_ptr_id`);

最終スキーマ

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
DROP TABLE IF EXISTS `partners_partneruserrole`;
CREATE TABLE `partners_partneruserrole` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  ....
  PRIMARY KEY (`id`),
  UNIQUE KEY `uniq_partneruserrole` (`partner_id`,`partneruser_id`,`permission_id`),
  KEY `partners_partneruser_partneruser_id_d59f67cc_fk_partners_` (`partneruser_id`),
  KEY `partners_partneruser_permission_id_031e3996_fk_auth_perm` (`permission_id`),
  CONSTRAINT `partners_partneruser_partner_id_852ab185_fk_partners_` FOREIGN KEY (`partner_id`) REFERENCES `partners_partner` (`id`),
  CONSTRAINT `partners_partneruser_partneruser_id_d59f67cc_fk_partners_` FOREIGN KEY (`partneruser_id`) REFERENCES `partners_partneruser` (`user_ptr_id`),
  CONSTRAINT `partners_partneruser_permission_id_031e3996_fk_auth_perm` FOREIGN KEY (`permission_id`) REFERENCES `auth_permission` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;