Clave primaria en Oracle

La clave primaria en Oracle es una de los aspectos más importantes a la hora de crear una tabla. La clave primaria indica a la tabla cuando un registro es único, es decir, la columna o columnas escogidas nunca tendrán valores repetidos ni con valores nulos.

Ejemplo

Para entenderlo voy a poner un ejemplo muy sencillo… imagina que tienes una tabla de empleados con columnas de nombre, apellidos, DNI, etc… ¿cuál de estas columnas crees que seria la clave primaria? En este caso es el DNI, porque cada persona tiene un número de DNI y jamás se repetirá, es único. A grandes rasgos podemos decir que la clave primaria de una tabla es como el DNI de una persona, un dato único, que nunca se puede repetir y con el cual puedes identificar el resto de valores.

Requisitos

  • Normalmente la clave primaria se define al crear la tabla, aunque no es obligatorio.
  • Cualquier columna, de cualquier tipo, puede ser una clave primaria.
  • La clave primaria puede ser un columna o un conjunto de columnas de uno o más tipos de datos.
  • Solo puede existir una clave primaria por tabla.
  • Los valores de la columna de la clave primaria no se pueden repetir y no puede contener valores nulos.

Definir clave primaria al crear la tabla

Lo habitual es crear la clave primaria cuando creamos la tabla. Se hace con la siguiente sintaxis:

CREATE TABLE nombre_tabla (
	columna_1 tipo_dato PRIMARY KEY,
	columna_2 tipo_dato,
	…
);

En el siguiente ejemplo puedes observar como se crea la clave primaria sobre la columna DNI de la tabla de clientes:

CREATE TABLE clientes (
	dni varchar(9) PRIMARY KEY,
	nombre varchar(50)
);

Si necesitas crear una clave primaria de dos o más columnas la sintaxis es la siguiente:

CREATE TABLE nombre_tabla (
	columna_1 tipo_dato,
	columna_2 tipo_dato,
	… 
        PRIMARY KEY (columna_1, columna_2)
);

Nombre de la clave primaria

El nombre de la clave primaria es automático y aleatorio al no ser que se especifique su nombre. Su nomenclatura es similar a SYS_C0093820648.

Si quisiéramos definir el nombre a la clave primaria deberíamos crearla de la siguiente forma:

CREATE TABLE clientes (
	dni varchar(9),
	nombre varchar(50),
	CONSTRAINT pk_dni PRIMARY KEY(DNI)
);

Definir clave primaria de una tabla ya existente

Esto no debería ser lo habitual y siempre se debería crear la clave primaria al crear la tabla inicialmente, pero si por cualquier motivo la tabla no tiene clave primaria, puedes crearla con la siguiente sintaxis.

ALTER TABLE nombre_tabla 
ADD PRIMARY KEY (columna_1, columna_2);

En el siguiente ejemplo puedes observar como se ha creado la tabla productos sin clave primaria y posteriormente se le asigna una:

CREATE TABLE productos (
	n_producto INTEGER,
	coste NUMERIC
);

ALTER TABLE productos 
ADD PRIMARY KEY (n_producto);

Borrar clave primaria

Si quieres eliminar una clave primaria usa la siguiente sintaxis:

-- Si conoces el nombre de la clave
ALTER TABLE nombre_tabla 
DROP CONSTRAINT nombre_clave_primaria;

-- Si desconoces el nombre de la clave
ALTER TABLE nombre_tabla
DROP PRIMARY KEY;

Destacar que debes escribir el nombre exacto de la clave primaria, no el nombre de la columna que es clave primaria.

Activar/desactivar clave primaria

Si no quieres borrarla pero necesitas desactivarla o activarla de nuevo, usa la siguiente sintaxis:

--Desactivar método 1
ALTER TABLE nombre_tabla
DISABLE CONSTRAINT nombre_clave_primaria;

--Desactivar método 2
ALTER TABLE nombre_tabla
DISABLE PRIMARY KEY;

--Activar método 1
ALTER TABLE nombre_tabla
ENABLE CONSTRAINT nombre_clave_primaria;

--Activar método 2
ALTER TABLE nombre_tabla
ENABLE PRIMARY KEY;

Información sobre una clave primaria

Si desconoces el nombre de la clave primaria, si esta activada o desactivada u otra información de la clave primaria, puedes ejecutar la siguiente sentencia modificando el nombre de la tabla a consultar:

SELECT cons.constraint_name, cons.constraint_type, cols.table_name, cols.column_name, cols.position, cons.status, cons.owner
FROM all_constraints cons, all_cons_columns cols
WHERE cols.table_name = 'CLIENTES'
AND cons.constraint_type = 'P'
AND cons.constraint_name = cols.constraint_name
AND cons.owner = cols.owner
ORDER BY cols.table_name, cols.position;

Escribir un comentario