【问题标题】:cannot drop a foreign key in mySQL不能在 mySQL 中删除外键
【发布时间】:2023-03-23 15:42:01
【问题描述】:

这是人员和订单之间的常见示例。我只是从互联网上复制它作为测试。

CREATE TABLE Persons (
    ID int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Age int,
    PRIMARY KEY (ID) );

CREATE TABLE Orders (
    OrderID int NOT NULL,
    OrderNumber int NOT NULL,
    PersonID int,
    PRIMARY KEY (OrderID),
    FOREIGN KEY (PersonID) REFERENCES Persons(ID)
);

到目前为止,一切都成功了。但是如何删除外键 PersonID?

我试过了。

ALTER TABLE Orders
DROP FOREIGN KEY PersonID;

MySQL 说:

1091 - 无法删除“PersonID”;检查列/键是否存在

【问题讨论】:

  • 您尝试删除的外键名称不存在。您需要通过查询找到它。 stackoverflow.com/questions/7765820/query-to-find-foreign-keys。编辑:如果你不命名约束,它通常被命名为“table_name.column_name”,所以在你的例子中,“Orders.PersonID”。
  • "PersonID" 是键应用的字段的名称,但不是(必然)键本身的名称。正如 T Gray 所说,如果您不知道密钥的名称,则必须查询它
  • 嗨。这是一个常见问题解答。请始终在谷歌上搜索您的问题/问题/目标的许多清晰、简洁和特定的版本/措辞,带和不带您的特定字符串/名称,并阅读许多答案。将您发现的相关关键字添加到搜索中。如果您没有找到答案,请发布,使用 1 个变体搜索作为标签的标题和关键字。请参阅向下投票箭头鼠标悬停文本。如果您确实有要发布的非重复代码问题,请阅读并采取行动minimal reproducible example

标签: mysql sql foreign-keys


【解决方案1】:

使用语句识别约束的名称:

SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = 'Orders'
AND COLUMN_NAME = 'PersonID';

在您的ALTER TABLE 语句中使用来自CONSTRAINT_NAME 的结果。例如:

ALTER TABLE Orders
DROP FOREIGN KEY `myconstraint`;

来自MySQL Reference Manual的答案

【讨论】:

    【解决方案2】:

    你需要删除约束和键。首先通过执行以下操作找到约束

    1) 显示创建表订单;

    在此屏幕截图“fk_dayBreakUp_timetable”中选取 CONSTRAINT.. 的值

    2) ALTER TABLE Orders DROP foreign key >

    在这里你会做

    3) ALTER TABLE Orders DROP key >

    希望这能解决您的问题。

    【讨论】:

    • 如果外键被命名,这将起作用。在他的情况下,它不是,所以节目创建不会有帮助。如果没有名称,则约束默认为“table.column”。最好从字典 IMO 中获取约束。
    猜你喜欢
    • 2015-06-16
    • 2015-02-22
    • 1970-01-01
    • 2014-08-03
    • 2021-11-01
    • 2014-10-26
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多