pk_and_sequence_for(table)
public
Returns a table’s primary key and belonging sequence.
Show source
def pk_and_sequence_for(table)
result = query("SELECT attr.attname, seq.relname\nFROM pg_class seq,\npg_attribute attr,\npg_depend dep,\npg_namespace name,\npg_constraint cons\nWHERE seq.oid = dep.objid\nAND seq.relkind = 'S'\nAND attr.attrelid = dep.refobjid\nAND attr.attnum = dep.refobjsubid\nAND attr.attrelid = cons.conrelid\nAND attr.attnum = cons.conkey[1]\nAND cons.contype = 'p'\nAND dep.refobjid = '\#{quote_table_name(table)}'::regclass\n", 'PK and serial sequence')[0]
if result.nil? or result.empty?
result = query("SELECT attr.attname,\nCASE\nWHEN split_part(def.adsrc, '''', 2) ~ '.' THEN\nsubstr(split_part(def.adsrc, '''', 2),\nstrpos(split_part(def.adsrc, '''', 2), '.')+1)\nELSE split_part(def.adsrc, '''', 2)\nEND\nFROM pg_class t\nJOIN pg_attribute attr ON (t.oid = attrelid)\nJOIN pg_attrdef def ON (adrelid = attrelid AND adnum = attnum)\nJOIN pg_constraint cons ON (conrelid = adrelid AND adnum = conkey[1])\nWHERE t.oid = '\#{quote_table_name(table)}'::regclass\nAND cons.contype = 'p'\nAND def.adsrc ~* 'nextval'\n", 'PK and custom sequence')[0]
end
[result.first, result.last]
rescue
nil
end