2015-12-16 48 views
1

我試圖DROP SEQUENCE序列,應該不存在我的表中。 The documentation很明顯,如果使用CASCADE選項,那麼依賴於該序列的對象將被刪除。你如何確定這些對象可能是什麼(如果它們存在的話)?確定什麼對象依賴於一個序列?

具體來說,在生產數據庫中運行此操作之前,我需要驗證沒有任何關鍵字將被刪除。

我能確定如果的序列已經被使用:

dev=> SELECT sequence_name, last_value FROM mytable_columnname_seq; 

sequence_name   | last_value 
-----------------------+------------ 
mytable_columnname_seq |   2 
(1 row) 

在上面我們看到,last_value2,這意味着它已經被使用。但是沒有標明什麼

分辨率(和感謝a_horse_with_no_name和窯;我無法接受兩個答案,這是一種恥辱):

在「從屬」對象是序列被分配給該列的表的默認值。如果刪除列的默認值是安全的,那麼刪除序列同樣安全:沒有行或表將被刪除,並且它們的值將保持不變。

回答

1

如果一個序列owned by一列,像在這種情況下:

create table example_table (id serial); 

您可以使用pg_depend從序列名稱確定表名:

select refobjid::regclass as table_name 
from pg_depend 
where objid = 'example_table_id_seq'::regclass 
and deptype = 'a'; 

    table_name 
--------------- 
example_table 
(1 row) 
+0

這是說只有有問題的表是'依賴對象'嗎?如果是的話,如果使用CASCADE,表格將被刪除?這聽起來不太對勁? –

+0

表格不會被刪除。如果表格(或列)被刪除,則該序列將被刪除。 – klin

2

這個工作對我來說:

select n.nspname as table_schema, cl.relname as table_name 
from pg_class s 
    join pg_depend d on d.objid=s.oid and d.classid='pg_class'::regclass and d.refclassid='pg_class'::regclass 
    join pg_class cl on cl.oid = d.refobjid 
    join pg_namespace n on n.oid = cl.relnamespace 
    join pg_attribute a on a.attrelid = cl.oid and a.attnum=d.refobjsubid 
where s.relkind='S' 
    and d.deptype='a' 
    and n.nspname = 'schema of the sequence' 
    and s.relname = 'sequence name' 
+0

這樣做的結果是'table_name':是說'CASCADE'會刪除表嗎? (在這種情況下,PostGres文檔很清楚它認爲是一個「對象」。) –

+0

@NathanielFord:no。 'cascade'不會刪除該表,只會列與該序列的關聯。因此,「串行」列將成爲沒有默認值的「普通」整數列。 –

+0

爲什麼要提供'RESTRICT'選項呢?我必須在那裏錯過一些基本的理解。 –

相關問題