Index für eine Spalte finden

Du kannst mittels

select pg_get_serial_sequence('my_table', 'my_column')

ermitteln, ob einer Spalte eine Sequence zugewiesen wurde.

Weitere Details zu der Funktion findest Du hier:
PostgreSQL: Documentation: Manuals: PostgreSQL 8.4: System Information Functions

Danke, habe ich auch schon gesehen, liefert aber kein eindeutiges Ergebnis. Ich habe dafür mal 2 Sequenzen (sequence1, sequence2) erstellt und beide mit “ALTER SEQUENCE sequence[1|2] OWNED BY table.col” auf dieselbe Spalte gelegt. Als default-Wert der Spalte ist nextval(sequence1) definiert.

Pgadmin zeigt an:
Default: nextval(‘testbed.sequence1’::regclass);
Sequence: testbed.sequence1

psql zeigt an:
select pg_get_serial_sequence(‘table’, ‘col’);
testbed.sequence2

Die Spalte hatte übrigens auch keinen PK-constraint und war auch nicht mit dem serial-alias, sondern integer definiert.

:confused:

Woher beziehen die Programme bloß ihre Informationen…?

An deiner Stelle würde ich anfangen, im Source für die ganzen Sequence-Funktionen zu schauen. Dort steht irgendwo drin, wie die Beziehungen abgebildet werden.

ALTER SEQUENCE … OWNED BY … wäre auch ein guter Startpunkt.

Im Zweifel hat psql Recht würde ich sagen.

Richtig. Und im Source steht, was pg_get_serial_sequence() genau macht.

Bin leider noch nicht weitergekommen. Was ändert sich eigentlich für die Sequenz und für die Spalte, wenn eine Seqenz mit “ALTER SEQUENCE $table_$column_seq OWNED BY $table.$column” einer Spalte zugeordnet wird?

Es wird irgendwo in den Systemtabellen ein Eintrag abgelegt. Leider weiß ich auch nicht auswendig, wo das steht. Daher mein Hinweis mit Source Code lesen.



test=# create table ratio (id int);
CREATE TABLE
test=*# create sequence ration_seq;
CREATE SEQUENCE
test=*# drop table ratio;
DROP TABLE
test=*# select nextval('ration_seq');
 nextval
---------
       1
(1 row)

test=*# rollback;
ROLLBACK
test=# create table ratio (id int);
CREATE TABLE
test=*# create sequence ration_seq;
CREATE SEQUENCE
test=*# alter sequence ration_seq owned by ratio.id;
ALTER SEQUENCE
test=*# drop table ratio;
DROP TABLE
test=*# select nextval('ration_seq');
ERROR:  relation "ration_seq" does not exist
LINE 1: select nextval('ration_seq');

Du siehst den Unterschied?

Andreas

pd_depend


Andreas

Schon klar, irgendwo dort. Aber die Details weiß ich nicht.
Und habe keine Lust, sie herauszusuchen :wink:

Ja, der Aufwand lohnt den Nutzen nicht. Es sei denn, der Fragesteller löhnt …


Andreas