70 - Eliminar campos (alter table- drop)


Problema:

Trabajamos con la tablas "libros" y "editoriales" de una librería.
Eliminamos las tablas:

 drop table libros;
 drop table editoriales;

Creamos las tablas:

 create table editoriales(
  codigo number(3),
  nombre varchar2(30),
  primary key(codigo)
 );

 create table libros(
  titulo varchar2(30),
  editorial number(3),
  autor varchar2(30),
  precio number(6,2),
  constraint FK_libros_editorial
   foreign key(editorial)
   references editoriales(codigo)
 );

Eliminamos un campo de la tabla "libros":

 alter table libros
  drop column precio;

Vemos la estructura de la tabla "libros":

 describe libros;

El campo "precio" ya no existe.

Recuerde que no pueden eliminarse los campos referenciados por una "foreign key". Intentamos eliminar el campo "codigo" de "editoriales":

 alter table editoriales
  drop column codigo;

Un mensaje indica que la sentencia no fue ejecutada.

Eliminamos el campo "editorial" de "libros":

 alter table libros
  drop column editorial;

Verificamos que el campo no existe:

 describe libros;

El campo se ha eliminado y junto con él la restricción "foreign key":

 select *from user_constraints
  where table_name='LIBROS';

Ahora si podemos eliminar el campo "codigo" de "editoriales", pues la restricción "foreign key" que hacía referencia a ella ya no existe:

 alter table editoriales
  drop column codigo;

El campo "codigo" de "editoriales" se ha eliminado y junto con él la restricción "primary key":

 select *from user_constraints
  where table_name='EDITORIALES';

Agregamos un índice compuesto sobre "titulo" y "autor" de "libros":

 create unique index I_libros_titulo
  on libros(titulo,autor);

Veamos si existe tal índice:

 select index_name,column_name,column_position
  from user_ind_columns
  where table_name='LIBROS';

Recuerde que si elimina un campo indizado, su índice también se elimina. Eliminamos el campo "autor" de "libros":

 alter table libros
  drop column autor;

Veamos si existe el índice compuesto creado anteriormente sobre los campos "titulo" y "autor" de "libros":

 select index_name,column_name,column_position
  from user_ind_columns
  where table_name='LIBROS';

Ya no existe.

La tabla ahora solamente consta de un campo, por lo tanto, no puede eliminarse, pues la tabla no puede quedar vacía de campos:

 alter table libros
  drop column titulo;

Mensaje de error.

Ingresemos el siguiente lote de comandos en el Oracle SQL Developer:

 drop table libros;
 drop table editoriales;

 create table editoriales(
  codigo number(3),
  nombre varchar2(30),
  primary key(codigo)
 );

 create table libros(
  titulo varchar2(30),
  editorial number(3),
  autor varchar2(30),
  precio number(6,2),
  constraint FK_libros_editorial
   foreign key(editorial)
   references editoriales(codigo)
 );

 -- Eliminamos un campo de la tabla "libros":
 alter table libros
  drop column precio;

 -- Vemos la estructura de la tabla "libros":
 describe libros;

 -- Intentamos eliminar el campo "codigo" de "editoriales":
 alter table editoriales
  drop column codigo;
 -- Un mensaje indica que la sentencia no fue ejecutada.

 -- Eliminamos el campo "editorial" de "libros":
 alter table libros
  drop column editorial;

 describe libros;
 -- El campo se ha eliminado y junto con él la restricción "foreign key":

 select *from user_constraints
  where table_name='LIBROS';

 -- Ahora si podemos eliminar el campo "codigo" de "editoriales", pues la 
 -- restricción "foreign key" que hacía referencia a ella ya no existe:
 alter table editoriales
  drop column codigo;

 select *from user_constraints
  where table_name='EDITORIALES';

-- Agregamos un índice compuesto sobre "titulo" y "autor" de "libros":
 create unique index I_libros_titulo
  on libros(titulo,autor);

 --Veamos si existe tal índice:
 select index_name,column_name,column_position
  from user_ind_columns
  where table_name='LIBROS';

 --Recuerde que si elimina un campo indizado, su índice también se elimina. 
 -- Eliminamos el campo "autor" de "libros":
 alter table libros
  drop column autor;

 --Veamos si existe el índice compuesto creado anteriormente sobre los 
 -- campos "titulo" y "autor" de "libros":
 select index_name,column_name,column_position
  from user_ind_columns
  where table_name='LIBROS';

 -- La tabla ahora solamente consta de un campo, por lo tanto, no puede eliminarse,
 -- pues la tabla no puede quedar vacía de campos:
 alter table libros
  drop column titulo;
 -- Mensaje de error.

La ejecución de este lote de comandos SQL genera una salida similar a:

SQL Developer alter table eliminar campo


Retornar