Copiar la estructura de la tabla en una nueva tabla

91

¿Hay alguna forma de copiar la estructura de una tabla en una nueva tabla, sin datos, incluidas todas las claves y restricciones?

Alex S
fuente

Respuestas:

107

Para una copia de esquema simple, use la cláusula like.

CREATE TABLE new_table_name ( like old_table_name including all)
codificadores
fuente
13
Vale la pena señalar que también puede agregar nuevas columnas cuando usa la sintaxis similar:CREATE TABLE new (like old, extra_column text);
Brad Koch
@BradKoch ¿es posible agregar restricciones adicionales dentro de esta declaración? ¿O debería ser uno separado?
Andrey Deineko
@AndreyDeineko Depende, consulte los documentos de la tabla de creación para obtener detalles completos. Puede agregar fácilmente restricciones de verificación y clave externa usando esta sintaxis, al igual que con cualquier otra declaración de creación, pero no estoy seguro de si las restricciones de nivel de columna como no nulo se pueden aplicar sin una modificación posterior.
Brad Koch
2
Lo intenté ahora. No copió las restricciones ni los activadores de clave externa (PostgreSQL 9.2).
Jānis Elmeris
73

Bueno, lo más cercano que puede obtener con SQL es:

create table new (
    like old
    including defaults
    including constraints
    including indexes
);

Pero no copiará todo. Las cosas más importantes que faltan son LLAVES EXTRANJERAS. Además, los disparadores tampoco se copian. No estoy seguro de otras cosas.

Otra forma es volcar la estructura de la tabla, cambiar su nombre en el volcado y volver a cargarlo:

pg_dump -s -t old databases | sed 's/old/new/g' | psql

Pero tenga cuidado, que ese sed simplista también cambiará lo antiguo a lo nuevo en otros lugares (por ejemplo, si tiene en la columna de su tabla llamada "is_scolded" se convertirá en "is_scnewed").

La pregunta es más bien: ¿por qué lo necesita? Porque para varios propósitos, usaría diferentes técnicas.


fuente
Nota: including constraintsno funciona en PostgreSQL 8.3
Ragnar123
1
Funcionó como un encanto en Postgres 9.3 :)
Ganapathy
14
La mejor respuesta. ¡Solo tenga en cuenta que si tiene un valor "serial" o alguna otra columna predeterminada en una secuencia, usará la misma secuencia que la tabla anterior! Entonces, si inserta cosas en cualquiera de las tablas, se incrementará para ambas.
sudo
19

Para copiar una tabla por completo, también se puede utilizar la forma abreviada con el comando TABLE:

CREATE TABLE films2 AS
    TABLE films
    WITH NO DATA;

Más detalles aquí

Dimo Boyadzhiev
fuente
Desafortunadamente, esto también copia los datos, por lo que entiendo, la pregunta es sobre copiar solo el esquema
Jasmine
🙁 ids son NULL en la nueva tabla y no copian los valores predeterminados.
ilhan
10

Eche un vistazo a pgAdmin , la forma más sencilla de hacer lo que quiera con mucho.
Haga clic con el botón derecho en la tabla, Scripts - Crear.

ChssPly76
fuente
Solo tengo acceso a phpPgAdmin; No soy dueño del servidor.
Alex S
Lo suficientemente justo. En phpPgAdmin: navegue a la tabla, haga clic en Exportar, seleccione "Sólo estructura" y tendrá su script
ChssPly76
Estoy bastante seguro de que debe haber un error en esta instalación; solo muestra una página en blanco en el marco derecho cuando hago eso: /
Alex S
1
¿Probó las opciones "mostrar" o "descargar"? Si ambos no funcionan, entonces sí, podría ser un error. Si es así, deberá hacerlo a través de SQL, eche un vistazo al enlace en la respuesta de Dav.
ChssPly76
Descargar solo me da un archivo vacío.
Alex S
6

Qué tal si

CREATE TABLE sample_table_copy AS (SELECT * FROM sample_table WHERE 1 = 2)

respuesta de postgresql.org

picmate 涅
fuente
3
Desafortunadamente, esto no preserva claves, restricciones o valores predeterminados.
sudo
1
Una mejor manera de expresar 'DONDE 1 = 2' sería 'DONDE falso' o ninguna cláusula DONDE en absoluto, sino 'LIMIT 0' en su lugar.
Kenyakorn Ketsombut