如何在 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 ;
从最后一行开始,我们终于可以轻松删除该列了:)
假设我使用以下结构创建了一个 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 ;
从最后一行开始,我们终于可以轻松删除该列了:)