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 a identificadores de autoincremento en mysql con valor de autoincremento.
Entonces, ¿cómo puedo enumerar todas las secuencias en una base de datos Postgres DB ( versión 8.1 ) con información sobre la tabla en la que se usa, el siguiente valor, etc. con una consulta SQL?
Tenga en cuenta que no puedo usar la information_schema.sequences
vista en la versión 8.4.
Respuestas:
La siguiente consulta proporciona nombres de todas las secuencias.
Por lo general, una secuencia se denomina como
${table}_id_seq
. La simple coincidencia de patrones de expresiones regulares le dará el nombre de la tabla.Para obtener el último valor de una secuencia, use la siguiente consulta:
fuente
${table}_id_seq
sugerencia fue útil${table}_${column}_seq
para secuencias creadas automáticamenteTenga 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:
Como estoy usando una versión superior de PostgreSQL (9.1), y estaba buscando la misma respuesta alta y baja, agregué esta respuesta por el bien de la posteridad y para futuros buscadores.
fuente
Ejecutar:
psql -E
y luego\ds
fuente
Después de un poco de dolor, lo tengo.
la mejor manera de lograr esto es enumerar todas las tablas
y luego, para cada tabla, enumere todas las columnas con atributos
luego, para cada columna, pruebe si tiene una secuencia
y luego, obtener la información sobre esta secuencia
fuente
información de secuencia: valor máximo
SELECT * FROM information_schema.sequences;
información de secuencia: último valor
SELECT * FROM <sequence_name>
fuente
El atributo propietario de la secuencia modela la relación entre las secuencias generadas automáticamente (como las creadas para las columnas SERIAL) y la tabla principal.
Puede modificar esta relación utilizando la cláusula OWNED BY del comando ALTER SEQUENCE
Ej. ALTERAR SECUENCIA foo_id PROPIETADO por foo_schema.foo_table
para que se vincule a la tabla foo_table
o ALTERAR SECUENCIA foo_id PROPIO por NINGUNO
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 enlace 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 la tabla en una base de datos. La cláusula where lo filtra para incluir solo relaciones generadas automáticamente, lo que lo restringe a mostrar solo secuencias creadas por columnas con tipo SERIAL.
fuente
Sé que esta publicación es bastante antigua, pero la solución de CMS me pareció muy útil, ya que estaba buscando una forma automatizada de vincular una secuencia a la tabla Y a la columna, y quería compartirla. El uso de la tabla de catálogo pg_depend fue la clave. Expandí lo que se hizo para:
Esta versión agrega 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 asegurarse de que todas las secuencias en la base de datos estén configuradas correctamente. Por ejemplo:
¡Espero que esto ayude a alguien a restablecer secuencias!
fuente
Esta declaración enumera la tabla y la columna que está asociada con cada secuencia:
Código:
más ver aquí enlace para responder
fuente
Mejora de la respuesta anterior:
fuente
Parcialmente probado pero parece mayormente completo.
Crédito donde se debe el crédito ... es en parte ingeniería inversa del SQL registrado desde a \ d en una tabla conocida que tenía una secuencia. Estoy seguro de que también podría estar más limpio, pero bueno, el rendimiento no era una preocupación.
fuente
Una especie de truco, pero prueba esto:
Elimine la última UNIÓN y ejecute el resultado.
fuente
Obtenga secuencias por cada columna de cada tabla mediante el análisis de la cláusula DEFAULT. Este método proporciona información sobre qué secuencias de columnas están vinculadas y no utiliza dependencias que pueden no existir para algunas secuencias. ¡Incluso la
pg_get_serial_sequence(sch.nspname||'.'||tbl.relname, col.attname)
función no encontró todas las secuencias para mí!Solución:
Tenga en cuenta que 1 secuencia se puede usar en varias tablas, por lo que se puede enumerar en varias filas aquí.
fuente
Gracias por tu ayuda.
Aquí está la función pl / pgsql que actualiza cada secuencia de una base de datos.
fuente
Aquí hay otro que tiene el nombre del esquema al lado del nombre de la secuencia
fuente
Esta función muestra el último valor de cada secuencia.
Produce una tabla de 2 columnas que dice el nombre de la secuencia más su último valor generado.
fuente
Asumiendo la
exec()
función declarada en esta publicación https://stackoverflow.com/a/46721603/653539 , las secuencias junto con sus últimos valores se pueden recuperar utilizando una sola consulta:fuente
fuente
Aquí hay un ejemplo de cómo usar
psql
para obtener una lista de todas las secuencias con suslast_value
:psql -U <username> -d <database> -t -c "SELECT 'SELECT ''' || c.relname || ''' as sequence_name, last_value FROM ' || c.relname || ';' FROM pg_class c WHERE (c.relkind = 'S')" | psql -U <username> -d <database> -t
fuente