151 votos

¿Existe un equivalente de SHOW CREATE TABLE de MySQL en Postgres?

¿Existe un equivalente de SHOW CREATE TABLE de MySQL en Postgres? ¿Es posible hacerlo? Si no, ¿cuál sería la mejor solución?

Necesito la declaración porque la uso para crear la tabla en un servidor remoto (a través de WCF).

0 votos

¿Estás buscando una sola declaración de consulta SQL que genere una declaración de CREAR? No puede hacerse en PostgreSQL. En MySQL, eso funcionaría porque todo se puede definir en una sola declaración CREATE. En PostgreSQL, eso no funcionaría porque las partes se manejan como cosas diferentes. Por ejemplo, el AUTO_INCREMENT de MySQL se administra dentro de su tabla, mientras que el SEQUENCE equivalente de PostgreSQL se administra de forma independiente. Por lo tanto, se requerirían múltiples declaraciones de consulta para imitar completamente una sola tabla de PostgreSQL. A diferencia de MySQL, una única consulta de CREAR puede funcionar por sí misma.

79voto

alvosu Puntos 5860

Pg_dump:

pg_dump -st tablename dbname

o utiliza Herramientas GUI de PostgreSQL (pgAdmin, phpPgAdmin, etc.)

0 votos

Intentaré explicar el problema con más detalle. Necesito la declaración SQL (select o procedimiento almacenado) porque ejecuto el comando SQL en C# (NpgsqlCommand). Por lo tanto, creo que pg_dump no es la solución en este caso. :(

3 votos

¿Por qué no? --schema-only tiene este propósito exacto: Mostrar las declaraciones SQL para crear el esquema/la tabla. Puedes luego alimentar esta salida en tu programa C# de alguna manera.

0 votos

Mira los views de information_schema: postgresql.org/docs/9.0/interactive/information-schema.html

61voto

RJS Puntos 864

Puedes intentar rastrear en el archivo de registro de PostgreSQL lo que realmente hace pg_dump --table table --schema-only. Luego puedes utilizar el mismo método para escribir tu propia función SQL.

1 votos

Ok, rastreé el pg_dump. Pero no fue tan fácil, porque tuve que escribir mi propia función en C# para escribir la declaración de creación de la tabla. Pero fue de gran ayuda, así que muchas gracias. :D

2 votos

No es necesario complicarse tanto: según aquí, puedes usar la opción -E para rastrear lo que está sucediendo en segundo plano cuando ejecutas un comando psql - -E: describirá las consultas subyacentes de los comandos \ (genial para aprender!) - ¡Espero que esto ayude!

48voto

kevinmicke Puntos 131

En la línea de comandos (psql) puedes ejecutar: \d para listar todas las columnas, sus tipos e índices.

18voto

Eli Puntos 575

Basándonos en la primera parte de la respuesta de @CubicalSoft, puedes agregar la siguiente función que debería funcionar para tablas simples (supone el esquema 'public' predeterminado y omite restricciones, índices y tipos de datos definidos por el usuario, etc.). La respuesta de @RJS es la única forma de hacerlo correctamente en este momento; ¡esto es algo que debería estar integrado en psql!

CREATE OR REPLACE FUNCTION show_create_table(table_name text, join_char text = E'\n' ) 
  RETURNS text AS 
$BODY$
SELECT 'CREATE TABLE ' || $1 || ' (' || $2 || '' || 
    string_agg(column_list.column_expr, ', ' || $2 || '') || 
    '' || $2 || ');'
FROM (
  SELECT '    ' || column_name || ' ' || data_type || 
       coalesce('(' || character_maximum_length || ')', '') || 
       case when is_nullable = 'YES' then '' else ' NOT NULL' end as column_expr
  FROM information_schema.columns
  WHERE table_schema = 'public' AND table_name = $1
  ORDER BY ordinal_position) column_list;
$BODY$
  LANGUAGE SQL STABLE;

14voto

cloudhead Puntos 10279

Me doy cuenta de que llegué un poco tarde a esta fiesta, pero este fue el primer resultado de mi búsqueda en Google, así que pensé en responder con lo que se me ocurrió.

Puedes avanzar bastante hacia una solución con esta consulta para obtener las columnas:

SELECT *
FROM information_schema.columns
WHERE table_schema = 'NOMBRETUESQUEMA' AND table_name = 'TUTABLA'
ORDER BY ordinal_position;

Y luego esta consulta para los índices más comunes:

SELECT c.oid, c.relname, a.attname, a.attnum, i.indisprimary, i.indisunique
FROM pg_index AS i, pg_class AS c, pg_attribute AS a
WHERE i.indexrelid = c.oid AND i.indexrelid = a.attrelid AND i.indrelid = 'NOMBRETUESQUEMA.TUTABLA'::regclass
ORDER BY" => "c.oid, a.attnum

Luego es cuestión de construir la(s) cadena(s) de consulta en el formato correcto.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X