如何在 MySQL 中删除带有外键的列?

How to drop a column with foreign key in MySQL?

假设我使用以下结构创建了一个 table:

CREATE TABLE staff (
    sid INT AUTO_INCREMENT,
    sfname VARCHAR(30) NOT NULL,
    slname VARCHAR(30) NOT NULL,
    uid int UNIQUE,
    bid int NOT NULL,
    PRIMARY KEY (sid),
    FOREIGN KEY (uid) REFERENCES sajilo_user(uid),
    FOREIGN KEY (bid) REFERENCES branch(bid)
);

现在我想为外键添加 DELETE CASCADE,我发现我可以通过删除列(带有外键的列)并在 alter [= 上使用 DELETE CASCADE 属性 再次添加它来实现它24=]声明。

但是当我尝试时:

ALTER TABLE staff DROP column uid;
I got error:  #1553 - Cannot drop index 'u_user': needed in a foreign key constraint.

所以我需要先删除外键约束:

ALTER TABLE staff DROP FOREIGN KEY foreign_key_constraint_name;

正如您在上面看到的,table 是在没有给出约束名称的情况下创建的。我很难放下它。那么应该怎么办呢? 我需要删除列以及外键约束的方法:)

最后,我找到了解决方案,我们可以使用information_schema来检索外键的名称,并且可以使用名称事件约束名称未明确设置,如上所示。

截至 MySQL 文档: INFORMATION_SCHEMA 提供对数据库元数据、有关 MySQL 服务器的信息(例如数据库名称或 table、列的数据类型或访问权限)的访问。有时用于此信息的其他术语是数据字典和系统目录。

欲了解更多信息,请访问:https://dev.mysql.com/doc/refman/8.0/en/information-schema.html

所以我们可以这样做:

USE information_schema;
SELECT * FROM `INNODB_SYS_FOREIGN_COLS`;

其中INNODB表示存储引擎,更多信息请访问: https://dev.mysql.com/doc/refman/8.0/en/storage-engines.html

执行查询后,我们可以得到如下结果:

ID                                  FOR_COL_NAME  REF_COL_NAME     POS  
----------------------------------  ------------  ------------  --------
acdb/takes_ibfk_1                   sid           sid                  0
acdb/takes_ibfk_2                   cid           cid                  0
sajilo_courier/admin_branch_ibfk_1  aid           aid                  0
sajilo_courier/admin_branch_ibfk_2  bid           bid                  0
sajilo_courier/admin_ibfk_1         uid           uid                  0
sajilo_courier/admin_staff_ibfk_1   aid           aid                  0
sajilo_courier/admin_staff_ibfk_2   sid           sid                  0
sajilo_courier/staff_ibfk_1         uid           uid                  0

正如我们在 ID 中看到的,包含 database/foreign 键名的名称,所以最后我们可以做类似

的事情
ALTER TABLE staff DROP FOREIGN KEY staff_ibfk_1 ;

从最后一行开始,我们终于可以轻松删除该列了:)