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>