Maison  >  Questions et réponses  >  le corps du texte

Impossible de supprimer l'index '*' : obligatoire -> dans la contrainte de clé étrangère mais lequel ?

Contexte

J'ai un problème pour supprimer une ligne d'un tableau.

J'utilise ces requêtes pour supprimer d'abord sa clé étrangère, puis supprimer la colonne vers laquelle pointe la clé.

ALTER TABLE resources drop foreign key fk_res_to_addr;
    ALTER TABLE resources drop column address_id;

Supprimer les contraintes fonctionne très bien. La suppression d'une colonne échoue avec Cannot drop index 'fk_res_to_addr': required in aforeign key constraint.

Ce que j'ai essayé jusqu'à présent

J'ai d'abord essayé (et j'essaie toujours) de découvrir ce qui dépend encore de cet index. J'ai utilisé cette requête (trouvée dans cette réponse) :

SELECT
    TABLE_NAME,
    COLUMN_NAME,
    CONSTRAINT_NAME, 
    REFERENCED_TABLE_NAME,
    REFERENCED_COLUMN_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
    TABLE_SCHEMA = 'some_db' AND
    REFERENCED_TABLE_NAME = 'resources';

Mais il n’y a rien là-bas.

Ensuite j'ai essayé de désactiver la vérification :

SET FOREIGN_KEY_CHECKS=0;

Bien sûr, puis réactivez-les. Cela n’a également aucun effet.

Puis-je faire autre chose pour comprendre ce qui dépend de cet indice ? Est-ce que j'ai raté quelque chose ?

** EDIT - définition de la table comme demandé ** Il s'agit de la définition actuelle de la table. Comme vous pouvez le voir, address_id possède désormais une clé étrangère, mais l'index est toujours là.

create table resources
(
id                                     bigint auto_increment primary key,
created                                bigint           not null,
lastModified                           bigint           not null,
uuid                                   varchar(255)     not null,
description                            longtext         null,
internalName                           varchar(80)      null,
publicName                             varchar(80)      not null,
origin                                 varchar(80)      null,
archived                               bigint unsigned  null,
contact_id                             bigint           null,
colorClass                             varchar(80)      null,
address_id                             bigint           null,
url                                    mediumtext       null,
constraint uuid
    unique (uuid),
constraint FK_contact_id
    foreign key (contact_id) references users (id)
)
charset = utf8;

create index fk_res_to_addr on resources (address_id);

create index idx_resources_archived on resources (archived);

create index idx_resources_created on resources (created);

P粉155710425P粉155710425207 Il y a quelques jours343

répondre à tous(2)je répondrai

  • P粉145543872

    P粉1455438722024-03-26 20:06:21

    Si vous êtes prêt à essayer

    SHOW INDEXES FROM database_name.table_name;

    Cela pourrait vous dire si fk_res_to_addr' a réellement été supprimé.

    répondre
    0
  • P粉068510991

    P粉0685109912024-03-26 16:29:38

    Je n'ai jamais rencontré cela auparavant, mais c'est tellement grave que je soupçonne qu'il pourrait y avoir un bug MySQL. Cela fonctionne "juste" dans mariadb.

    Vous devriez voir l'erreur Can't DROP 'fk_res_to_addr' ; Vérifiez si la colonne/clé existe et l'erreur que vous avez signalée - voir https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=c5b0bbc9d6c12f74e00ba8d059a15638

    Lors de la création, mysql crée l'index en utilisant le nom que vous avez attribué à fk et attribue son propre nom à fk. Le résultat est l'erreur mentionnée ci-dessus plus https://dbfiddle.uk/?rdbms=mysql_5. 7&fiddle=c5b0bbc9d6c12f74e00ba8d059a15638.

    Je vous suggère d'essayer de supprimer la clé, puis la clé étrangère, puis la colonne.

    répondre
    0
  • Annulerrépondre