无法删除表,因为其他对象依赖于它

Posted

技术标签:

【中文标题】无法删除表,因为其他对象依赖于它【英文标题】:cannot drop table because other objects depend on it 【发布时间】:2017-04-14 04:25:37 【问题描述】:

我正在尝试开发一个 postgres 数据库,并且我正在使用 SQLAlchemy 来映射我的数据库。问题是我在依赖项方面遇到了太多错误,并开始清理一些关系以进行调试,但我仍然遇到同样的问题

当我这样做时

python manage.py db upgrade

我收到以下错误:

sqlalchemy.exc.InternalError: (InternalError) cannot drop table proposalstate 因为其他对象依赖它 详细信息:表提议上的约束提议_idproposalstate_fkey 取决于表提议状态 提示:使用 DROP ... CASCADE 也可以删除依赖对象。 '\nDROP TABLE 提案状态'

这是我的 postgres 代码:

DROP TABLE IF EXISTS users;
DROP TABLE IF EXISTS position CASCADE;
DROP TABLE IF EXISTS proposalstate CASCADE;
DROP TABLE IF EXISTS proposals CASCADE;
DROP TABLE IF EXISTS category CASCADE;
DROP TABLE IF EXISTS politics CASCADE;
DROP TABLE IF EXISTS role CASCADE;
DROP TABLE IF EXISTS domain CASCADE;
DROP TABLE IF EXISTS organizations CASCADE;


CREATE TABLE users (
    uid SERIAL PRIMARY KEY,
    firstname VARCHAR(100) NOT NULL,
    lastname VARCHAR(100) NOT NULL,
    email VARCHAR(120) NOT NULL,
    pwdhash VARCHAR(150) NOT NULL,
    phoneNumber INTEGER
);

CREATE TABLE organizations (
    idOrganization SERIAL PRIMARY KEY,
    publicName TEXT NOT NULL,
    completeName TEXT NOT NULL,
    startDate NUMERIC CHECK (startDate <= EXTRACT(ISOYEAR FROM CURRENT_TIMESTAMP)),
    endDate NUMERIC CHECK (startDate < endDate),
    publicBioLink TEXT
);

CREATE TABLE category (
    idCategory SERIAL PRIMARY KEY,
    category TEXT UNIQUE NOT NULL,
    description TEXT
);

CREATE TABLE proposalstate (
    idProposalState SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    description TEXT,
    stateDate TIMESTAMP,
    stateLink TEXT
);

SELECT EXTRACT(ISOYEAR FROM CURRENT_TIMESTAMP);

CREATE TABLE proposals (
    idProposal SERIAL PRIMARY KEY,
   -- nameProposal VARCHAR(120) NOT NULL,
    description VARCHAR(10000) NOT NULL,
    "dateProposal" TIMESTAMP,    
    linkProposal VARCHAR(1000),
    idCategory INTEGER REFERENCES category(idCategory) ON DELETE CASCADE,
    idProposalState INTEGER REFERENCES proposalstate(idProposalState) ON DELETE CASCADE
);



CREATE TABLE politics (
    idPolitician SERIAL PRIMARY KEY,
    publicName VARCHAR(150) NOT NULL,
    completeName VARCHAR(300) NOT NULL,
    publicBioLink TEXT,
    "startDate" TIMESTAMP,
    "endDate" TIMESTAMP CHECK ("startDate" < "endDate")
);



CREATE TABLE domain (
    idDomain SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    officialName TEXT NOT NULL,
    publicBioLink TEXT
);

CREATE TABLE role (
    idRole SERIAL PRIMARY KEY,
    name TEXT NOT NULL
);

CREATE TABLE position (
    idPosition SERIAL PRIMARY KEY ,
    name TEXT NOT NULL,
    "dateStart" TIMESTAMP,
    "dateEnd" TIMESTAMP CHECK ("dateStart" < "dateEnd"),
    link TEXT,
    idPolitician INTEGER NOT NULL REFERENCES politics(idPolitician) ON DELETE CASCADE,
    idRole INTEGER NOT NULL REFERENCES role(idRole) ON DELETE CASCADE,
    idDomain INTEGER REFERENCES domain(idDomain),
    idOrganization INTEGER NOT NULL REFERENCES organizations(idOrganization) ON DELETE CASCADE
);

起初我以为这是我执行DROP TABLE 的顺序,它似乎是固定的,然后我在DROP TABLE 之后添加了CASCADE,仍然无法正常工作。

ma​​nage.py

import os
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand

from app import app
from models import db


app.config.from_object(os.environ['APP_SETTINGS'])

migrate = Migrate(app, db)
manager = Manager(app)

manager.add_command('db', MigrateCommand)


if __name__ == '__main__':
    manager.run()

知道发生了什么吗?

问候

【问题讨论】:

仍然 same 错误?.. 是的,即使我颠倒了放置顺序 如果你在psql中运行你的sql语句列表?..仍然SAME错误? 在 psql 上它实际上下降了。为什么会这样?为什么我运行upgrade 命令时会失败。难道不应该删除所有表并重新创建它们吗? 我相信你也应该发布 python 代码。因为它执行的操作与您在 SQL 中指定的不同 【参考方案1】:

您以错误的顺序删除表 - 您应该先删除具有外键引用的表,然后再删除引用它们的表。

事实上(假设您的问题中没有其他表未显示)然后按照您创建它们的相反顺序删除它们应该可以工作。

【讨论】:

我以相反的顺序删除它们,但仍然:cannot drop table organizations because other objects depend on it DETAIL: constraint organizationsproposals_idorganization_fkey on table organizationsproposals depends on table organizations constraint position_idorganization_fkey on table "position" depends on table organizations 他来回更改顺序,出现同样的错误 - 他显示的 SQL 不是正在执行的 @Perseverance 您现在引用的错误消息提到了一个表“organizationsproposals”,该表未包含在您的 SQL 中。那一个也需要被删除/重新创建。它还抱怨表“位置” - 如果您以相反的顺序执行此操作,则必须删除 first,如果您遇到该错误,则无法这样做。

以上是关于无法删除表,因为其他对象依赖于它的主要内容,如果未能解决你的问题,请参考以下文章

错误:无法删除角色,因为某些对象依赖于它

SQL Server:使用 FK 删除表

PostgreSQL表依赖性跟踪

Redshift - 如何显示 CASCADE 将删除的依赖项?

.为啥被定义为参照表的表无法删除?

在 PostgresQL 中删除角色