Подтвердить что ты не робот

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

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

DROP   TABLE  IF EXISTS schemas.book;
DROP   TABLE  IF EXISTS schemas.category;
DROP   SCHEMA IF EXISTS schemas;
CREATE SCHEMA schemas;

CREATE TABLE schemas.category (
  id          BIGSERIAL PRIMARY KEY,
  name        VARCHAR   NOT NULL,
  UNIQUE(name)
);

CREATE TABLE schemas.book (
  id          BIGSERIAL PRIMARY KEY,
  published   DATE      NOT NULL,
  category_id BIGINT    NOT NULL REFERENCES schemas.category ON DELETE CASCADE ON UPDATE CASCADE,
  author      VARCHAR   NOT NULL,
  name        VARCHAR   NOT NULL,
  UNIQUE(published, author, name),
  FOREIGN KEY(category_id) REFERENCES schemas.category (id)
);

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

4b9b3361

Ответ 1

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

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

UPDATE 1:

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

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

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

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

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

Ответ 2

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

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

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

Пример:

CREATE SCHEMA shire;

CREATE TABLE shire.clans (
    id serial PRIMARY KEY,
    clan varchar
);

CREATE TABLE shire.hobbits (
    id serial PRIMARY KEY,
    hobbit varchar,
    clan_id integer REFERENCES shire.clans (id) ON DELETE CASCADE
);

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

[email protected]> psql
sauron=# SELECT * FROM shire.clans;
 id |    clan    
----+------------
  1 | Baggins
  2 | Gamgi
(2 rows)

sauron=# SELECT * FROM shire.hobbits;
 id |  hobbit  | clan_id 
----+----------+---------
  1 | Bilbo    |       1
  2 | Frodo    |       1
  3 | Samwise  |       2
(3 rows)

sauron=# DELETE FROM shire.clans WHERE id = 1 RETURNING *;
 id |  clan   
----+---------
  1 | Baggins
(1 row)

DELETE 1
sauron=# SELECT * FROM shire.hobbits;
 id |  hobbit  | clan_id 
----+----------+---------
  3 | Samwise  |       2
(1 row)

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

Ответ 3

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

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

Ответ 4

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

CREATE TABLE apps_user(
  user_id SERIAL PRIMARY KEY,
  username character varying(30),
  userpass character varying(50),
  created_on DATE
);

CREATE TABLE apps_profile(
    pro_id SERIAL PRIMARY KEY,
    user_id INT4 REFERENCES apps_user(user_id) ON DELETE CASCADE ON UPDATE CASCADE,
    firstname VARCHAR(30),
    lastname VARCHAR(50),
    email VARCHAR UNIQUE,
    dob DATE
);