Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

Copiar estructura tabla mediante "CREATE TABLE"

Estas en el tema de Copiar estructura tabla mediante "CREATE TABLE" en el foro de Oracle en Foros del Web. Buenos días a todos: Mi pregunta es la siguiente. Tenía entendido que mediante CREATE TABLE es posible copiar la estructura de una tabla en otra ...
  #1 (permalink)  
Antiguo 29/11/2012, 05:19
 
Fecha de Ingreso: junio-2009
Mensajes: 31
Antigüedad: 15 años, 5 meses
Puntos: 0
Copiar estructura tabla mediante "CREATE TABLE"

Buenos días a todos:

Mi pregunta es la siguiente. Tenía entendido que mediante CREATE TABLE es posible copiar la estructura de una tabla en otra distinta. La sentencia sería:

Código SQL:
Ver original
  1. CREATE TABLE copia AS (
  2. SELECT *
  3. FROM JOBS
  4. WHERE 1 = 0) ;

Sin embargo, puedo comprobar que la copia generada no es exactamente igual. Tras un describe de cada tabla, se aprecia que la columna JOB_ID puede ser nula, cuando es la clave primaria d ela tabla:

Código SQL:
Ver original
  1. DESCRIBE copia
  2. Nombre     Nulo     Tipo        
  3. ---------- -------- ------------
  4. JOB_ID              VARCHAR2(10)
  5. JOB_TITLE  NOT NULL VARCHAR2(35)
  6. MIN_SALARY          NUMBER(6)    
  7. MAX_SALARY          NUMBER(6)    
  8.  
  9. DESCRIBE jobs
  10. Nombre     Nulo     Tipo        
  11. ---------- -------- ------------
  12. JOB_ID     NOT NULL VARCHAR2(10)
  13. JOB_TITLE  NOT NULL VARCHAR2(35)
  14. MIN_SALARY          NUMBER(6)    
  15. MAX_SALARY          NUMBER(6)

¿Estoy haciendo algo mal? ¿O es que este método copia toda la estructura excepto la primary key?

Cualquier respuesta es bien recibida. Muchas gracias de antemano.

Última edición por gnzsoloyo; 30/11/2012 a las 06:53 Razón: Código SQL mal etiquetado
  #2 (permalink)  
Antiguo 29/11/2012, 05:55
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 17 años, 6 meses
Puntos: 43
Respuesta: Copiar estructura tabla mediante "CREATE TABLE"

Código SQL:
Ver original
  1. SQL> CREATE TABLE prueba1
  2.   2  ( a NUMBER NOT NULL PRIMARY KEY,
  3.   3  b NUMBER,
  4.   4  c NUMBER);
  5.  
  6. Tabla creada.
  7.  
  8. SQL> CREATE TABLE copia_prueba1 AS
  9.   2  SELECT * FROM prueba1
  10.   3  WHERE 1 = 0;
  11.  
  12. Tabla creada.
  13.  
  14. SQL> DESC prueba1
  15.  Name                            NULL?    TYPE
  16.  ------------------------------- -------- ----
  17.  A                               NOT NULL NUMBER
  18.  B                                        NUMBER
  19.  C                                        NUMBER
  20.  
  21. SQL> DESC  copia_prueba1 ;
  22.  Name                            NULL?    TYPE
  23.  ------------------------------- -------- ----
  24.  A                               NOT NULL NUMBER
  25.  B                                        NUMBER
  26.  C                                        NUMBER
  27.  
  28. SQL>

Última edición por gnzsoloyo; 01/12/2012 a las 12:16
  #3 (permalink)  
Antiguo 29/11/2012, 07:59
 
Fecha de Ingreso: junio-2009
Mensajes: 31
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Copiar estructura tabla mediante "CREATE TABLE"

Ante todo, gracias por responder.

Sí, veo que en tu caso funcionó. Pero no termino de ver qué diferencia hay. Puedes comprobar que en mi caso no funciona.

Estoy aprendiendo por ahora, así que discúlpame si es evidente y no lo veo.

Un saludo.
  #4 (permalink)  
Antiguo 29/11/2012, 08:26
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 10 meses
Puntos: 360
Respuesta: Copiar estructura tabla mediante "CREATE TABLE"

Cita:
¿Estoy haciendo algo mal? ¿O es que este método copia toda la estructura excepto la primary key?
Exacto. eso mismo es lo que pasa.
Si también requieres primary key te toca adicionarla manualmente.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #5 (permalink)  
Antiguo 30/11/2012, 01:00
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 17 años, 6 meses
Puntos: 43
Respuesta: Copiar estructura tabla mediante "CREATE TABLE"

Pero el caso es que aunque no creara la primary key ( no lo miré, ahora lo hago de nuevo ), el NOT NULL si que me lo hizo..........
  #6 (permalink)  
Antiguo 30/11/2012, 03:17
 
Fecha de Ingreso: junio-2009
Mensajes: 31
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Copiar estructura tabla mediante "CREATE TABLE"

Ciertamente, me interesa incluso más el saber por qué no me hizo el NOT NULL. No hay problema en añadir las PK aparte, pero al menos que la estructura me salga tal cual es.

Gracias.
  #7 (permalink)  
Antiguo 30/11/2012, 04:28
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 17 años, 6 meses
Puntos: 43
Respuesta: Copiar estructura tabla mediante "CREATE TABLE"

Ya sé porqué, mira :
Código SQL:
Ver original
  1. SQL> CREATE TABLE jc
  2.   2  ( a NUMBER PRIMARY KEY,
  3.   3  b NUMBER,
  4.   4  c NUMBER);
  5.  
  6. Tabla creada.
  7.  
  8. SQL> CREATE TABLE jc2 AS SELECT * FROM jc WHERE 1=0;
  9.  
  10. Tabla creada.
  11.  
  12. SQL> DESC jc
  13.  Name                            NULL?    TYPE
  14.  ------------------------------- -------- ----
  15.  A                               NOT NULL NUMBER
  16.  B                                        NUMBER
  17.  C                                        NUMBER
  18.  
  19. SQL> DESC jc2
  20.  Name                            NULL?    TYPE
  21.  ------------------------------- -------- ----
  22.  A                                        NUMBER
  23.  B                                        NUMBER
  24.  C                                        NUMBER
  25.  
  26. SQL>
Comparalo con lo que puse yo :
Código SQL:
Ver original
  1. SQL> CREATE TABLE jc
  2.   2   ( a NUMBER NOT NULL PRIMARY KEY, --<----
  3.   3   b NUMBER,
  4.   4   c NUMBER);
  5.  
  6. Tabla creada.
  7.  
  8. SQL>  CREATE TABLE jc2 AS SELECT * FROM jc WHERE 1=0;
  9.  
  10. Tabla creada.
  11.  
  12. SQL>  DESC jc
  13.  Name                            NULL?    TYPE
  14.  ------------------------------- -------- ----
  15.  A                               NOT NULL NUMBER
  16.  B                                        NUMBER
  17.  C                                        NUMBER
  18.  
  19. SQL>  DESC jc2
  20.  Name                            NULL?    TYPE
  21.  ------------------------------- -------- ----
  22.  A                               NOT NULL NUMBER
  23.  B                                        NUMBER
  24.  C                                        NUMBER
  25.  
  26. SQL>
¿ ves la diferencia ?

Última edición por gnzsoloyo; 01/12/2012 a las 12:18
  #8 (permalink)  
Antiguo 01/12/2012, 11:50
 
Fecha de Ingreso: junio-2009
Mensajes: 31
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Copiar estructura tabla mediante "CREATE TABLE"

Has creado una columna como not null en una tabla y en la otra no. La copia se crea en ambos casos de forma idéntica.

En mi caso, puedes ver que job_id no se copia como not null cuando sí se ha creado como tal. Por lo tanto... Estoy haciendo algo mal, verdad???

Gracias.
  #9 (permalink)  
Antiguo 03/12/2012, 07:41
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 10 meses
Puntos: 360
Respuesta: Copiar estructura tabla mediante "CREATE TABLE"

No es que estés haciendo algo mal, esto tiene que ver con la forma como declaras el primary key en la primera tabla.

Si te fijas a jc3000 no le da problemas, ya que incluye el primary key como parte del campo.
Pero si hago esto que es funcionalmente lo mismo, se replica el escenario que indicas.

Código SQL:
Ver original
  1. SQL> CREATE TABLE prueba1
  2.   2      ( a NUMBER,
  3.   3      b NUMBER,
  4.   4      c NUMBER,
  5.   5      CONSTRAINT pkprueba1 PRIMARY KEY(a));
  6.  
  7. Tabla creada.
  8.  
  9. SQL> CREATE TABLE prueba2 AS SELECT *FROM prueba1 WHERE 1=0;
  10.  
  11. Tabla creada.
  12.  
  13. SQL> DESC prueba1
  14.  Nombre                                    &#9488;Nulo?   Tipo
  15.  ----------------------------------------- -------- -------------
  16.  
  17.  A                                         NOT NULL NUMBER
  18.  B                                                  NUMBER
  19.  C                                                  NUMBER
  20.  
  21. SQL> DESC prueba2
  22.  Nombre                                    &#9488;Nulo?   Tipo
  23.  ----------------------------------------- -------- -------------
  24.  
  25.  A                                                  NUMBER
  26.  B                                                  NUMBER
  27.  C                                                  NUMBER
  28.  
  29. SQL>

Para pasarlo bien, lo que puedes hacer es crear la segunda tabla así.
Código SQL:
Ver original
  1. CREATE TABLE prueba2 (a NOT NULL,b,c) AS SELECT *FROM prueba1 WHERE 1=0;

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #10 (permalink)  
Antiguo 07/12/2012, 01:24
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 17 años, 6 meses
Puntos: 43
Respuesta: Copiar estructura tabla mediante "CREATE TABLE"

Es otra solución, Huesos.

Pero yo no la veo muy util y te digo porqué. Esto viene bien en tablas que tienen una estructura simple, pocos campos y todos nulos excepto la PK que en muchos casos se alimentaría de una secuencia. Pero ¿ y en tablas que tienen una estructura mas compleja ?, por ejemplo una PK con varios campos, tabla con mas de 70 - 80 campos. Utilizar tu ejemplo sería muy "coñazo", sería mas rentable crearla tal cual y luego añadir los not null o la pk a manija.

Pero bueno, creo que ya hemos dado suficientes ideas a Salami, para que eliga la que entienda que es mejor para cubrir sus necesidades.

Un saludo
  #11 (permalink)  
Antiguo 07/12/2012, 07:08
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 10 meses
Puntos: 360
Respuesta: Copiar estructura tabla mediante "CREATE TABLE"

Tienes razón jc3000.

Mas que una solución, mi post es una explicación al porque no se le generaba a salami el constraint de not null al momento de crear la tabla basado en un select.

Saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #12 (permalink)  
Antiguo 09/12/2012, 17:33
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 17 años, 6 meses
Puntos: 43
Respuesta: Copiar estructura tabla mediante "CREATE TABLE"

Si, si.

Toda idea / ejemplo que pueda ayudar al compañero siempre es bienvenida ¡¡¡¡

:)

Etiquetas: create, estructura, mediante, select, sql, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:47.