Меню

PostgreSQL FOREIGN KEY ON УДАЛИТЬ КАСКАД

Каскадные удаления в PostgreSQL

У меня есть база данных с несколькими десятками таблиц, связанных с внешними ключами. При нормальных обстоятельствах мне нужно поведение по умолчанию ON DELETE RESTRICT для этих ограничений. Но при попытке поделиться снимком базы данных с консультантом мне нужно было удалить некоторые конфиденциальные данные. Я хотел бы, чтобы мои воспоминания о команде DELETE FROM Table CASCADE не были чистой галлюцинацией.

В конце концов я сбросил базу данных, написал сценарий для обработки дампа, добавив предложения ON DELETE CASCADE ко всем ограничениям внешнего ключа, восстановив их, выполнив удаление, снова сбросив, удалив ON DELETE CASCADE и, наконец, восстановив снова. Это было проще, чем написать запрос на удаление, который мне понадобился бы для этого в SQL-удаление целых фрагментов базы данных не является нормальной операцией, поэтому схема не совсем адаптирована к ней.

Есть ли у кого-нибудь лучшее решение на следующий раз, когда возникнет что-то подобное?

7 ответов

Сначала я использую код Entity Framework, и я столкнулся с проблемой, когда мне нужно отключить каскадное удаление для определенного внешнего ключа. Вот мой класс сущностей: public class ChallengeMatch < public int Id < get; set; >public int ChallengerClubMemberId < get; set; >public int.

В моей базе данных PostgreSQL 9.2 определено много триггеров уровня строк AFTER DELETE, которые используются для удаления дочерних строк при удалении родительской строки. (Существует также много FKs с on DELETE CASCADE в тех случаях, когда дочерняя строка ссылается на родительскую строку.) Это.

Вам не нужно сбрасывать и восстанавливать. Вы должны быть в состоянии просто отбросить ограничение, перестроить его с помощью cascade, выполнить удаление, снова отбросить его и перестроить с помощью restrict.

Я новичок в Postgres, поэтому не уверен, каков компромисс между TRUNCATE и DROP.

Вы можете создать ограничения внешнего ключа как DEFERRABLE. Тогда вы сможете временно отключить их во время очистки данных и снова включить, когда закончите. Взгляните на этот вопрос .

У меня есть 2 таблицы, которые представляют родитель —

УСЕЧЕНИЕ просто удаляет данные из таблицы и оставляет структуру

@Tony: нет, схемы могут быть полезны, и действительно, мы используем их для разделения данных в нашей базе данных. Но я говорю о попытке очистить конфиденциальные данные, прежде чем позволить консультанту получить копию базы данных. Я хочу, чтобы эти данные исчезли.

Возможно, вы захотите изучить использование схем с PostgreSQL. Я делал это в прошлых проектах, чтобы позволить разным группам людей или разработчикам иметь свои собственные данные. Затем вы можете использовать свои скрипты для создания нескольких копий вашей базы данных именно для таких ситуаций.

Читайте также:  Цитаты чиновников о народе и пенсионерах

Я не думаю, что вам нужно было бы обрабатывать файл дампа таким образом. Сделайте потоковое dump/restore, и обработайте его. Что-то вроде:

где вы храните все свои DELETE SQL-запросы на удаление-sensitive.sql. База данных sanitizeddb/шаги могут быть удалены, если вы не возражаете, чтобы консультант получил БД с CASCADE внешними ключами вместо RESTRICT внешних ключей.

Возможно, есть и лучшие способы в зависимости от того, как часто вам нужно это делать, насколько велика база данных и какой процент данных чувствителен, но я не могу придумать более простого способа сделать это один или два раза для базы данных разумного размера . В конце концов, вам понадобится другая база данных, поэтому, если у вас уже нет slony-кластера, вы не сможете избежать цикла дампа/восстановления, который может занять много времени.

Похожие вопросы:

Я пишу приложение с ручной моделью предметной области (классы) и ручной моделью данных (tables/relationships), и позволяю NHibernate позаботиться о отображении. Лучше всего сказать базе данных.

Laravel 5 использует библиотеку Dotenv для конфигураций конкретной среды, которые не должны контролироваться версиями (например, ключи, секреты) Однако могут ли существовать приложения, которые.

Совсем MongoMapper с идентификацией карты поддержка каскадного удаления? На самом деле это не так, но я могу что-то упустить где-то в документации. Рассмотреть следующее: class User include.

Сначала я использую код Entity Framework, и я столкнулся с проблемой, когда мне нужно отключить каскадное удаление для определенного внешнего ключа. Вот мой класс сущностей: public class.

В моей базе данных PostgreSQL 9.2 определено много триггеров уровня строк AFTER DELETE, которые используются для удаления дочерних строк при удалении родительской строки. (Существует также много FKs.

У меня есть 2 таблицы, которые представляют родитель —

Источник

Postgresql каскадное удаление таблиц

DROP TABLE — удалить таблицу

Синтаксис

Описание

DROP TABLE удаляет таблицы из базы данных. Удалить таблицу может только её владелец, владелец схемы или суперпользователь. Чтобы опустошить таблицу, не удаляя её саму, вместо этой команды следует использовать DELETE или TRUNCATE .

DROP TABLE всегда удаляет все индексы, правила, триггеры и ограничения, существующие в целевой таблице. Однако, чтобы удалить таблицу, на которую ссылается представление или ограничение внешнего ключа в другой таблице, необходимо дополнительно указать CASCADE . (С указанием CASCADE зависимое представление удаляется полностью, тогда как в случае с ограничением внешнего ключа удаляется именно это ограничение, а не вся таблица, к которой оно относится.)

Читайте также:  Свойство 3 возведение степени в квадрат

Параметры

Не считать ошибкой, если таблица не существует. В этом случае будет выдано замечание. имя

Имя (возможно, дополненное схемой) таблицы, подлежащей удалению. CASCADE

Автоматически удалять объекты, зависящие от данной таблицы (например, представления), и, в свою очередь, все зависящие от них объекты (см. Раздел 5.13). RESTRICT

Отказать в удалении таблицы, если от неё зависят какие-либо объекты. Это поведение по умолчанию.

Примеры

Удаление таблиц films и distributors :

Совместимость

Эта команда соответствует стандарту SQL, но возможность удалять в одной команде несколько таблиц и указание IF EXISTS являются расширениями PostgreSQL .

Источник



PostgreSQL: FOREIGN KEY/ON УДАЛИТЬ КАСКАД

У меня есть две таблицы, как здесь:

Итак, логика проста, после того, как пользователь удаляет всю книгу под категорией x, x удаляется из кошек, я пробовал метод выше, но не работает, после того, как я очистил таблицу книг, все еще заполненную категорию таблицы, что не так?

ОТВЕТЫ

Ответ 1

Внешний ключ с каскадным удалением означает, что если запись в родительской таблице будет удалена, то соответствующие записи в дочерней таблице будут автоматически удалены. Это называется каскадным удалением.

Вы говорите противоположным образом, это не значит, что при удалении из дочерней таблицы записи будут удалены из родительской таблицы.

ON DELETE CASCADE — указать, хотите ли вы удалять строки в дочерней таблице, когда соответствующие столбцы будут удалены в родительской таблице. Если вы не укажете каскадные удаления, поведение по умолчанию сервера базы данных по умолчанию не позволяет удалять данные в таблице, если ссылаются на другие таблицы.

Если вы укажете этот параметр, позже, когда вы удалите строку в родительской таблице, сервер базы данных также удалит любые строки, связанные с этой строкой (внешние ключи) в дочерней таблице. Основным преимуществом функции каскадирования-удаления является то, что она позволяет уменьшить количество операторов SQL, необходимых для выполнения действий удаления.

Итак, все, что произойдет, когда вы удаляете строки из родительской таблицы, а не из дочерней таблицы.

Итак, в вашем случае, когда пользователь удаляет записи из таблицы CATs, строки будут удалены из таблицы книг.:)

Надеюсь, это поможет вам:)

Ответ 2

Exerpt из PostgreSQL документация:

Ограничительные и каскадные удаления являются двумя наиболее распространенными параметрами. [. ] CASCADE указывает, что при удалении ссылочной строки строки (строки), ссылающиеся на нее, также должны автоматически удаляться.

Это означает, что если вы удалите категорию, на которую ссылаются книги, справочная книга также будет удалена с помощью ON DELETE CASCADE .

Читайте также:  Как включить функцию Поиск решения

Пример:

DELETE FROM кланы будут CASCADE для hobbits на REFERENCES .

Если вам действительно нужно обратное (проверено базой данных), вам придется написать триггер!

Ответ 3

В моем скромном опыте с postgres 9.6, каскадное удаление не работает на практике для таблиц, которые растут выше тривиального размера.

  • Хуже того, в то время как каскад удаления продолжается, задействованные таблицы блокируются, поэтому эти таблицы (и, возможно, вся ваша база данных) непригодным для использования.
  • Тем не менее, трудно получить postgres, чтобы рассказать вам, что это делается во время удаления каскада. Если это займет много времени, какая таблица или таблицы замедляет работу? Возможно, это где-то в информация pg_stats? Трудно сказать.

Ответ 4

Клавиша штамповки PostgreSQL DELETE, UPDATE CASCADE

Источник

PostgreSQL создание, удаление, изменение таблиц

database_postgres

Создание таблицы:

Значение по умолчанию при создании таблиц:

Значением по умолчанию может быть выражение, которое будет оцениваться при вставке значения по умолчанию (а не при создании таблицы). Типичным примером является то, что timestamp столбец имеет значение по умолчанию CURRENT_TIMESTAMP , поэтому для него устанавливается время вставки строки.

Или может потребоваться генерация серийного номера, например так:

NOT NULL — проверка на заполенность:

Проверка на уникальность:

Уникальные и заполненные

Можно записать так:

Ссылки на другие таблицы

Ссылки на другие таблицы, отношение многие ко многим

Запрещение удаления если есть ссылки и каскадное удаление

RESTRICT — запрещает удаление, если есть ссылки

CASCADE — каскадное удаление, и ссылающихся

Удаление таблицы

Также можно использовать DROP TABLE IF EXISTS — для того чтобы не выбрасывалась ошибка, если базы не существует.

Изменение таблиц

Добавление столбца

Удаление столбца

Однако если на столбец есть ссылки, тогда он не будет удален, можно использовать CASCADE и для удаления всех ссылок

Добавление ограничений столбцу

Удаление ограничений у столбца

Чтобы удалить не нулевое ограничение:

Изменение значения по умолчанию у столбца

Для удаления значения по умолчанию у столбца:

Изменение типа данных столбца

Переименование столбца

Переименование таблицы

Пример создания таблицы users из Node.js

Информационная схема

В базе PostgreSQL есть информационная схема и в ней несколько таблиц.

Ниже опишу некоторые из них самые важные:

tables — позволяет получить список таблиц

например такой запрос:

Вернет все добавленные таблицы, без служебных таблиц posgres

Источник

Adblock
detector