Rumah  >  Soal Jawab  >  teks badan

Tidak boleh menjatuhkan indeks '*': diperlukan -> dalam kekangan kunci asing tetapi yang mana satu?

Konteks

Saya menghadapi masalah memadamkan baris daripada jadual.

Saya menggunakan pertanyaan ini untuk memadamkan kunci asingnya dahulu dan kemudian memadamkan lajur yang dituju oleh kunci tersebut.

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

Mengalih keluar kekangan berfungsi dengan baik. Pemadaman lajur gagal dengan Cannot drop index 'fk_res_to_addr': required in aforeign key constraint.

Apa yang saya cuba setakat ini

Saya mula-mula mencuba (dan masih mencuba) untuk mengetahui apa yang masih bergantung pada indeks itu. Saya menggunakan pertanyaan ini (terdapat dalam jawapan ini):

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';

Tetapi tiada apa-apa di sana.

Kemudian saya cuba melumpuhkan cek:

SET FOREIGN_KEY_CHECKS=0;

Sudah tentu, kemudian dayakannya semula. Ini juga tiada kesan.

Adakah apa-apa lagi yang boleh saya lakukan untuk mengetahui perkara yang bergantung pada indeks ini? Adakah saya kehilangan sesuatu?

** EDIT - definisi jadual seperti yang diminta** Ini ialah definisi jadual semasa. Seperti yang anda lihat, address_id kini mempunyai kunci asing, tetapi indeks masih ada.

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粉155710425229 hari yang lalu382

membalas semua(2)saya akan balas

  • P粉145543872

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

    Jika anda sudi mencuba

    SHOW INDEXES FROM database_name.table_name;

    Ia mungkin memberitahu anda jika fk_res_to_addr' sebenarnya telah dipadamkan.

    balas
    0
  • P粉068510991

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

    Saya tidak pernah menemui ini sebelum ini, tetapi sangat teruk saya mengesyaki mungkin terdapat pepijat mysql. Ia berfungsi "hanya" dalam mariadb.

    Anda sepatutnya melihat ralat Tidak dapat MENYELESAIKAN 'fk_res_to_addr'; Semak sama ada lajur/kunci itu wujud dan ralat yang anda laporkan - lihat https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=c5b0bbc9d6c12f74e00ba15d6c12f74e00ba16d Pada penciptaan, mysql mencipta indeks menggunakan nama yang anda tetapkan kepada fk dan memberikan namanya sendiri kepada fk. Hasilnya ialah ralat yang disebutkan di atas ditambah

    https://dbfiddle.uk/?rdbms=mysql_5. 7&fiddle=c5b0bbc9d6c12f74e00ba8d059a15638

    . Saya cadangkan anda cuba mengeluarkan kunci, kemudian kunci asing, kemudian lajur.

    balas
    0
  • Batalbalas