secuencia español desde datos create consultas consultar con cero bases aprender administración sql database postgresql migration sequences

desde - manual de postgresql 10 en español pdf



Listar todas las secuencias en un Postgres db 8.1 con SQL (13)

Aquí hay otro que tiene el nombre del esquema al lado del nombre de la secuencia

select nspname,relname from pg_class c join pg_namespace n on c.relnamespace=n.oid where relkind = ''S'' order by nspname

Estoy convirtiendo un db de postgres a mysql.

Como no puedo encontrar una herramienta que haga el truco en sí, voy a convertir todas las secuencias de postgres para autoincrementar identificadores en mysql con valor de autoincrement.

Entonces, ¿cómo puedo enumerar todas las secuencias en un DB de Postgres (versión 8.1 ) con información sobre la tabla en la que se utiliza, el siguiente valor, etc. con una consulta SQL?

Tenga en cuenta que no puedo usar la vista information_schema.sequences en la versión 8.4.


Ejecutar: psql -E , y luego /ds


Es un truco, pero prueba esto:

selecciona ''seleccionar'' '''' || relname || '''' ''como secuencia, last_value from'' || relname || ''union'' FROM pg_catalog.pg_class c DONDE c.relkind IN (''S'', '''');

Elimine la última UNIÓN y ejecute el resultado


Esta declaración enumera la tabla y la columna que está asociada a cada secuencia:

Código:

SELECT t.relname as related_table, a.attname as related_column, s.relname as sequence_name FROM pg_class s JOIN pg_depend d ON d.objid = s.oid JOIN pg_class t ON d.objid = s.oid AND d.refobjid = t.oid JOIN pg_attribute a ON (d.refobjid, d.refobjsubid) = (a.attrelid, a.attnum) JOIN pg_namespace n ON n.oid = s.relnamespace WHERE s.relkind = ''S'' AND n.nspname = ''public''

más ver aquí enlace para responder


Gracias por tu ayuda.

Aquí está la función pl / pgsql que actualiza cada secuencia de una base de datos.

--------------------------------------------------------------------------------------------------------- --- Nom : reset_sequence --- Description : Générique - met à jour les séquences au max de l''identifiant --------------------------------------------------------------------------------------------------------- CREATE OR REPLACE FUNCTION reset_sequence() RETURNS void AS $BODY$ DECLARE _sql VARCHAR := ''''; DECLARE result threecol%rowtype; BEGIN FOR result IN WITH fq_objects AS (SELECT c.oid,n.nspname || ''.'' ||c.relname AS fqname ,c.relkind, c.relname AS relation FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace ), sequences AS (SELECT oid,fqname FROM fq_objects WHERE relkind = ''S''), tables AS (SELECT oid, fqname FROM fq_objects WHERE relkind = ''r'' ) SELECT s.fqname AS sequence, t.fqname AS table, a.attname AS column FROM pg_depend d JOIN sequences s ON s.oid = d.objid JOIN tables t ON t.oid = d.refobjid JOIN pg_attribute a ON a.attrelid = d.refobjid and a.attnum = d.refobjsubid WHERE d.deptype = ''a'' LOOP EXECUTE ''SELECT setval(''''''||result.col1||'''''', COALESCE((SELECT MAX(''||result.col3||'')+1 FROM ''||result.col2||''), 1), false);''; END LOOP; END;$BODY$ LANGUAGE plpgsql; SELECT * FROM reset_sequence();


La relación entre las secuencias generadas automáticamente (como las creadas para columnas SERIE) y la tabla primaria se modela mediante el atributo propietario de secuencia.

Puede modificar esta relación usando la cláusula OWNED BY del comando ALTER SEQUENCE

por ejemplo ALTER SEQUENCE foo_id OWNED por foo_schema.foo_table

para configurarlo para que esté vinculado a la tabla foo_table

o ALTER SEQUENCE foo_id PROPIEDAD de NONE

para romper la conexión entre la secuencia y cualquier tabla

La información sobre esta relación se almacena en la tabla de catálogo pg_depend .

la relación de unión es el vínculo entre pg_depend.objid -> pg_class.oid WHERE relkind = ''S'' - que vincula la secuencia al registro de unión y luego pg_depend.refobjid -> pg_class.oid WHERE relkind = ''r'', que vincula el unir registro a la relación propietaria (tabla)

Esta consulta devuelve todas las secuencias -> dependencias de tabla en una base de datos. La cláusula where lo filtra solo para incluir las relaciones generadas automáticamente, lo que lo restringe para que solo muestre secuencias creadas por columnas de tipo SERIAL.

WITH fq_objects AS (SELECT c.oid,n.nspname || ''.'' ||c.relname AS fqname , c.relkind, c.relname AS relation FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace ), sequences AS (SELECT oid,fqname FROM fq_objects WHERE relkind = ''S''), tables AS (SELECT oid, fqname FROM fq_objects WHERE relkind = ''r'' ) SELECT s.fqname AS sequence, ''->'' as depends, t.fqname AS table FROM pg_depend d JOIN sequences s ON s.oid = d.objid JOIN tables t ON t.oid = d.refobjid WHERE d.deptype = ''a'' ;


La siguiente consulta da nombres de todas las secuencias.

SELECT c.relname FROM pg_class c WHERE c.relkind = ''S'';

Normalmente, una secuencia se denomina ${table}_id_seq . La coincidencia de patrón de expresión regular simple le dará el nombre de la tabla.

Para obtener el último valor de una secuencia, use la siguiente consulta:

SELECT last_value FROM test_id_seq;


Mejora de la respuesta anterior:

select string_agg(''select sequence_name, last_value from '' || relname, chr(13) || ''union'' || chr(13) order by relname) from pg_class where relkind =''S''


Parcialmente probado, pero se ve en su mayoría completo.

select * from (select n.nspname,c.relname, (select substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid) for 128) from pg_catalog.pg_attrdef d where d.adrelid=a.attrelid and d.adnum=a.attnum and a.atthasdef) as def from pg_class c, pg_attribute a, pg_namespace n where c.relkind=''r'' and c.oid=a.attrelid and n.oid=c.relnamespace and a.atthasdef and a.atttypid=20) x where x.def ~ ''^nextval'' order by nspname,relname;

Crédito donde se debe crédito ... en parte se ha diseñado por ingeniería inversa a partir del SQL registrado desde una / d en una tabla conocida que tenía una secuencia. Estoy seguro de que podría ser más limpio también, pero bueno, el rendimiento no era una preocupación.


Sé que esta publicación es bastante antigua, pero la solución de me pareció muy útil ya que estaba buscando una forma automática de vincular una secuencia a la columna Y de la tabla, y quería compartirla. El uso de la tabla de catálogo pg_depend fue la clave. Expandí lo que se hizo para:

WITH fq_objects AS (SELECT c.oid,n.nspname || ''.'' ||c.relname AS fqname , c.relkind, c.relname AS relation FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace ), sequences AS (SELECT oid,fqname FROM fq_objects WHERE relkind = ''S''), tables AS (SELECT oid, fqname FROM fq_objects WHERE relkind = ''r'' ) SELECT s.fqname AS sequence, ''->'' as depends, t.fqname AS table, a.attname AS column FROM pg_depend d JOIN sequences s ON s.oid = d.objid JOIN tables t ON t.oid = d.refobjid JOIN pg_attribute a ON a.attrelid = d.refobjid and a.attnum = d.refobjsubid WHERE d.deptype = ''a'' ;

Esta versión agrega una columna a la lista de campos devueltos. Con el nombre de la tabla y el nombre de la columna en la mano, una llamada a pg_set_serial_sequence hace que sea fácil garantizar que todas las secuencias en la base de datos estén configuradas correctamente. Por ejemplo:

CREATE OR REPLACE FUNCTION public.reset_sequence(tablename text, columnname text) RETURNS void LANGUAGE plpgsql AS $function$ DECLARE _sql VARCHAR := ''''; BEGIN _sql := $$SELECT setval( pg_get_serial_sequence(''$$ || tablename || $$'', ''$$ || columnname || $$''), (SELECT COALESCE(MAX($$ || columnname || $$),1) FROM $$ || tablename || $$), true)$$; EXECUTE _sql; END; $function$;

Espero que esto ayude a alguien a restablecer secuencias.


Tenga en cuenta que a partir de PostgreSQL 8.4 puede obtener toda la información sobre las secuencias utilizadas en la base de datos a través de:

SELECT * FROM information_schema.sequences;

Como uso una versión superior de PostgreSQL (9.1) y estaba buscando la misma respuesta alta y baja, agregué esta respuesta para la posteridad y para futuros buscadores.


después de un poco de dolor, lo tengo.

la mejor manera de lograr esto es hacer una lista de todas las tablas

select * from pg_tables where schemaname = ''<schema_name>''

y luego, para cada tabla, enumere todas las columnas con atributos

select * from information_schema.columns where table_name = ''<table_name>''

luego, para cada columna, prueba si tiene una secuencia

select pg_get_serial_sequence(''<table_name>'', ''<column_name>'')

y luego, obtener la información sobre esta secuencia

select * from <sequence_name>


información de la secuencia: valor máximo

SELECT * FROM information_schema.sequences;

información de la secuencia: último valor

SELECT * FROM <sequence_name>