¿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).
¿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).
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. :(
¿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.
Mira los views de information_schema: postgresql.org/docs/9.0/interactive/information-schema.html
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
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!
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;
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 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.
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 elSEQUENCE
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 deCREAR
puede funcionar por sí misma.