Pytanie w sprawie postgresql – Upuść sekwencję i kaskadę

15

Chciałbym upuścić sekwencję używaną w tabeli i samą tabelę w jednej instrukcji za pomocą CASCADE, ale otrzymuję NOTYFIKACJĘ, a tabela nie jest odrzucana. Na przykład:

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

A kiedy to zrobię:

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

Otrzymuję następującą wiadomość, a tabela nie jest odrzucana:

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

Zdecydowanie robię coś złego, ale to są moje pierwsze kroki w PostgreSQL.

Twoja odpowiedź

4   odpowiedź
3

sekwencja i kaskadę tego działania. Podczas, gdydomyślna nie może istnieć bez sekwencji, dlatego jest odrzucany, tabela i kolumnamogą istnieją bez sekwencji, więc pozostają.

W ten sposób, jak to określiłeś, upuszczenie tabeli nie spowoduje upuszczenia sekwencji, chociaż sekwencję można uzależnić od kolumny, z której jest używana, a zatem miećto upuść automatycznie, jeśli upuściszstół. Możesz to zrobić zmieniając właściciela sekwencji lub użyć zamiast tego SERIAL. Deklarowanie kolumny jako typu SERIAL automatycznie tworzy sekwencję, powoduje, że generuje ona domyślną kolumnę i czyni tę kolumnę właścicielem sekwencji.

36

m zależnym powiązanej sekwencji i jestnigdy upuszczony przez

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

Tylko rysunek wartości DEFAULT z sekwencji „zależy” od sekwencji i jest ustawiony na NULL, jeśli sekwencja zostanie usunięta za pomocąCASCADE.

Jest odwrotnie: jeśli sekwencja jest własnością kolumny tabeli, jest ona usuwana za pomocą

<code>DROP TABLE f1 CASCADE;
</code>

Aby sekwencja była własnością kolumny tabeli, możesz użyćserial typ, jak sugerował Milen. Albo możeszZMIEŃ istniejącą sekwencję:

<code>ALTER SEQUENCE seq1 OWNED BY t1.f1;
</code>
3

Nie wiem, dlaczego tworzysz sekwencję ręcznie - może masz uzasadnienie, a może to z powodu nawyków współpracujących z innym DBMS.

Ale jeśli nie masz na to szczególnej potrzeby, użyjSERIAL pseudo-typ i kiedy upuścisz tabelę, sekwencje zaSERIAL kolumny zostaną również odrzucone.

Początkowo myślałem, że nie mogę zainicjować sekwencji używającej makra SERIAL, ale teraz uznałem, że tworzy regularną sekwencję, którą normalnie mógłbym zainicjować. Przełączanie na SERIAL, dzięki. Chris Koston
0

możesz również użyć tego ... i zalecę również użycie numeru seryjnego z kluczem podstawowym, aby można było jednoznacznie zidentyfikować kolumnę.

Powiązane pytania