Вопрос по postgresql – Падение последовательности и каскад

15

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

<code>CREATE SEQUENCE seq1;
CREATE TABLE t1 (f1 INT NOT NULL DEFAULT nextval('seq1'));
</code>

И тогда, когда я делаю:

<code>DROP SEQUENCE seq1 CASCADE;
</code>

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

<code>NOTICE:  drop cascades to default for table t1 column f1
</code>

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

Ваш Ответ

4   ответа
36

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

DROP SEQUENCE ... CASCADE;

Только значение DEFAULT, полученное из последовательности & quot; зависит & quot; на последовательности и устанавливается в NULL, если последовательность удаляется сCASCADE.

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

DROP TABLE f1 CASCADE;

Чтобы последовательность принадлежала столбцу таблицы, вы можете использоватьserial типа, как Милен уже предложил. Или вы можетеИЗМЕНИТЬ существующую последовательность:

ALTER SEQUENCE seq1 OWNED BY t1.f1;
3

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

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

0

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

3

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

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

Сначала я думал, что не могу инициализировать последовательность, которая использует макрос SERIAL, но теперь я решил, что он создает регулярную последовательность, которую я мог бы инициализировать нормально. Переключение на SERIAL, спасибо. Chris Koston

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