2011-03-22 20 views
18

Tengo un escenario específico en el que tengo que insertar dos columnas nuevas en una tabla existente en Oracle. No puedo hacer caer y volver a crear la mesa. Entonces, ¿se puede lograr de alguna manera?¿Cómo insertar una columna en una posición específica en el oráculo sin soltar y volver a crear la tabla?

+4

En 12c hay un truco para hacerlo: http://tkyte.blogspot.com.au/2013/07/12c-silly-little-trick-with-invisibility.html (Nota, sin embargo, no hay razón lógica para cambiar el orden de las columnas.) –

+0

¿No le gustaría agregar las columnas que es más probable que sean nulas al final de la tabla para ahorrar espacio? Ver https://community.oracle.com/thread/855964 –

Respuesta

15

Amit-

no creo que se puede añadir una columna en cualquier lugar, pero al final de la tabla una vez que se crea la tabla. Una solución podría ser la de intentar esto:

CREATE TABLE MY_TEMP_TABLE AS 
SELECT * 
FROM TABLE_TO_CHANGE; 

eliminar la tabla que desea agregar columnas a:

DROP TABLE TABLE_TO_CHANGE; 

Es en el punto que podría reconstruir la tabla existente desde cero añadiendo en las columnas donde deseo. Supongamos para este ejercicio que desea agregar las columnas llamadas "COL2 y COL3".

A continuación, introduzca los datos de nuevo en la nueva tabla:

INSERT INTO TABLE_TO_CHANGE (COL1, COL2, COL3, COL4) 
SELECT COL1, 'Foo', 'Bar', COL4 
FROM MY_TEMP_TABLE; 

Cuando se inserta la tabla de datos en su "nuevo-viejo", se puede eliminar la tabla temporal.

DROP TABLE MY_TEMP_TABLE; 

Esto es a menudo lo que hago cuando quiero agregar columnas en una ubicación específica. Obviamente, si se trata de un sistema de producción en línea, probablemente no sea práctico, sino solo una idea potencial.

-CJ

5

Usted (todavía) no puede elegir la posición de la columna usando ALTER TABLE: sólo se puede añadir al final de la tabla. Obviamente, puede seleccionar las columnas en el orden que desee, de modo que a menos que esté utilizando SELECT * FROM, el orden de las columnas no debería ser un gran problema.

Si realmente debe tener en un orden particular y no se puede descartar y volver a la mesa, entonces usted podría ser capaz de soltar y volver a crear columnas en su lugar: -

la primera copia de la mesa

CREATE TABLE my_tab_temp AS SELECT * FROM my_tab; 

a continuación, colocar columnas que desea ser después de la columna se va a insertar

ALTER TABLE my_tab DROP COLUMN three; 

Ahora añadir la nueva columna (dos en este ejemplo) y los ha extraído.

ALTER TABLE my_tab ADD (two NUMBER(2), three NUMBER(10)); 

Por último, añadir de nuevo los datos para la re-creado columnas

UPDATE my_tab SET my_tab.three = (SELECT my_tab_temp.three FROM my_tab_temp WHERE my_tab.one = my_tab_temp.one); 

Obviamente su actualización será muy probablemente más complejo y que tendrá que manejar índices y restricciones y no podrá para usar esto en algunos casos (columnas LOB, etc.). Además, esta es una manera bastante espantosa de hacer esto, pero la tabla siempre existirá y terminarás con las columnas en el orden que quieras. Pero, ¿el orden de las columnas realmente importa tanto?

4

Aunque esto es algo antiguo, me gustaría agregar una versión ligeramente mejorada que realmente cambie el orden de las columnas.Estos son los pasos (suponiendo que tenemos una tabla TAB1 con columnas col1, col2, COL3):

  1. Añadir nueva columna a la tabla TAB1:
mesa
alter table TAB1 add (NEW_COL number);
  1. "copia" a temp nombrar mientras se cambia el orden de las columnas y cambiar el nombre de la nueva columna:
create table tempTAB1 as select NEW_COL as COL0, COL1, COL2, COL3 from TAB1;
  1. gota tabla existente:
drop table TAB1;
  1. de cambio de nombre temp nombredetabla a acaba de caer nombredetabla:
rename tempTAB1 to TAB1;
-10

Eso sí, como esto:

alter table TABLE_NAME (COLUMN_NAME  DATA_TYPE); 

Una nueva columna ser agregado al final de la tabla.

Cuestiones relacionadas