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

Капля последовательности и каскада

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

CREATE SEQUENCE seq1;
CREATE TABLE t1 (f1 INT NOT NULL DEFAULT nextval('seq1'));

И затем, когда я это сделаю:

DROP SEQUENCE seq1 CASCADE;

Я получаю следующее сообщение, и таблица не отбрасывается:

NOTICE:  drop cascades to default for table t1 column f1

Я определенно делаю что-то неправильно, но это мои первые шаги в PostgreSQL.

4b9b3361

Ответ 1

У вас неправильное представление о зависимостях. Таблица никогда не является зависимым объектом связанной последовательности и никогда не удаляется

DROP SEQUENCE ... CASCADE;

Только значение значения DEFAULT из последовательности "зависит" от последовательности и имеет значение NULL, если последовательность удалена с помощью CASCADE.

Это наоборот: если последовательность принадлежит столбцу таблицы, она отбрасывается с помощью

DROP TABLE f1 CASCADE;

Для последовательности, принадлежащей столбцу таблицы, вы можете использовать тип serial, как уже указывал Милен. Или вы можете ALTER существующую последовательность:

ALTER SEQUENCE seq1 OWNED BY t1.f1;

Ответ 2

Я не знаю, почему вы создаете последовательность вручную - возможно, у вас есть обоснование, или, может быть, из-за привычек, работающих с другой СУБД.

Но если у вас нет особой необходимости, используйте SERIAL псевдо-тип, и когда вы отбрасываете таблицу, последовательность (и) за столбцами SERIAL также будет отброшена.

Ответ 3

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

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

Ответ 4

drop каскад table table_name; вы также можете использовать это... и я также рекомендую вам использовать последовательный порт с первичным ключом, чтобы вы могли однозначно идентифицировать столбец.