Не может удалить пользователей таблицы, потому что другие объекты зависят от нее
Я хочу оставить свои таблицы в базе данных. Но когда я использую, например,DROP TABLE if exists users;
Я получаю это сообщение:
cannot drop table users because other objects depend on it
Я нашел решение, чтобы сбросить всю базу данных. Но, в любом случае, как решить эту проблему без полного удаления данных?
4 ответа
Использовать cascade
опция:
DROP TABLE if exists users cascade;
это удалит любой внешний ключ, который ссылается на users
таблица или любое представление, использующее его.
Это не удалит другие таблицы (или удалит строки из них).
Если действительно необходимо было удалить эту конкретную таблицу с ее созданием или без нее, то сначала найдите объект (ы), который зависит от нее.
CREATE OR REPLACE VIEW admin.v_view_dependency AS
SELECT DISTINCT srcobj.oid AS src_oid
, srcnsp.nspname AS src_schemaname
, srcobj.relname AS src_objectname
, tgtobj.oid AS dependent_viewoid
, tgtnsp.nspname AS dependant_schemaname
, tgtobj.relname AS dependant_objectname
FROM pg_class srcobj
JOIN pg_depend srcdep ON srcobj.oid = srcdep.refobjid
JOIN pg_depend tgtdep ON srcdep.objid = tgtdep.objid
JOIN pg_class tgtobj ON tgtdep.refobjid = tgtobj.oid AND srcobj.oid <> tgtobj.oid
LEFT JOIN pg_namespace srcnsp ON srcobj.relnamespace = srcnsp.oid
LEFT JOIN pg_namespace tgtnsp ON tgtobj.relnamespace = tgtnsp.oid
WHERE tgtdep.deptype = 'i'::"char" AND tgtobj.relkind = 'v'::"char";
Затем,
select top 99 * from admin.v_view_dependency where src_objectname like '%the_table_name_it_complaint_about%';
Результирующий набор покажет вам зависимый объект в поле "имя-зависимого_объекта".
В общем, чтобы удалить несколько взаимозависимых таблиц, вы начинаете с таблиц, от которых ничего не зависит (те, которые имеют внешние ключи, указывающие на другие таблицы), и работаете в обратном направлении. Например, если стол transactions
зависит от таблицы users
, вы бы бросили transactions
первый. Вкратце: удаляйте таблицы в порядке, обратном тому, как они были созданы.
Если вам удастся создать таблицы с циклическими зависимостями, вы можете сначала удалить ограничение внешнего ключа, которое предотвращает удаление. Или вы можете использовать модификатор CASCADE
, который (как объяснил @a_horse в комментариях), удалит все ограничения внешнего ключа, которые касаются удаленной таблицы. Но учтите, что не все СУБД поддерживают CASCADE
: Postgres делает, а MySQL нет (ключевое слово принимается, но не имеет никакого эффекта).
используйте следующую команду:
drop trigger "trigger_name" on "table_name";
согласно документации супабазы здесь .