sql >> Base de Datos >  >> RDS >> Oracle

Consultas principales sobre clave principal en Oracle con ejemplos

Comenzaremos con una introducción a la clave principal en Oracle y luego nos sumergiremos en varias consultas sobre ella.

Introducción a la clave principal

Una clave principal es una columna o conjunto de columnas en la tabla que identifica de forma única una fila en la tabla.

Propiedades de la clave principal

  1. No puede tener valores duplicados en él. es decir, debe ser único en la tabla
  2. No puede ser nulo ni contener cadenas vacías
  3. No debe cambiarse con el tiempo
  4. Solo podemos tener una clave principal en la tabla

Recomendación

  1. Se sugiere tener valores numéricos como clave principal, ya que es más rápido
  2. Todas las tablas deben tener claves primarias

Cómo agregar una clave principal en Oracle

La clave principal se puede agregar en la creación de la tabla o se puede crear después de la creación de la tabla.
Primero veamos la creación de la tabla

Clave principal en la creación de tablas

Se puede definir a nivel de columna o de tabla. Las claves primarias compuestas se definen solo a nivel de tabla. Cuando Oracle crea la clave principal, crea el índice único en esa columna de la tabla para hacer cumplir las restricciones de la clave principal.

Veamos primero el nivel de columna

Column Level
 SQL> CREATE TABLE DEPT_MASTER (
     dept_nr NUMBER PRIMARY KEY,
     dept_name varchar2(100) NOT NULL,
     dept_status NUMBER(1,0) NOT NULL,
     created_at date
   2  );  
 Table created.
 SQL> desc DEPT_MASTER
  Name                                      Null?    Type
 
  DEPT_NR                                   NOT NULL NUMBER
  DEPT_NAME                                 NOT NULL VARCHAR2(100)
  DEPT_STATUS                               NOT NULL NUMBER(1)
  CREATED_AT                                         DATE
 
SQL>  select index_name from dba_indexes where table_name='DEPT_MASTER';
INDEX_NAME
**********
 SYS_C0013850522

SQL> select CONSTRAINT_NAME,INDEX_NAME,CONSTRAINT_TYPE from user_constraints where TABLE_NAME='DEPT_MASTER';
 CONSTRAINT_NAME      INDEX_NAME           CONSTRAINT_TYPE
 
 SYS_C00478605                             C
 SYS_C00478606                             C
 SYS_C00478607        SYS_C00478607        P

Ahora veamos el nivel de la tabla

Table Level
SQL> CREATE TABLE DEPT_MASTER (
     dept_nr NUMBER ,
     dept_name varchar2(100) NOT NULL,
     dept_status NUMBER(1,0) NOT NULL,
     created_at date,
 PRIMARY KEY ("DEPT_NR")
    );   2    3    4    5    6    7
 Table created.
 
SQL>  select index_name from dba_indexes where table_name='DEPT_MASTER';
 INDEX_NAME
 SYS_C0013850525

SQL> select CONSTRAINT_NAME,INDEX_NAME,CONSTRAINT_TYPE from user_constraints where TABLE_NAME='DEPT_MASTER';
 CONSTRAINT_NAME      INDEX_NAME           CONSTRAINT_TYPE
 
 SYS_C00478605                             C
 SYS_C00478606                             C
 SYS_C00478607        SYS_C00478607        P

Podemos dar el nombre personalizado de la restricción de clave principal también usando la cláusula de restricción adicional como se muestra a continuación

SQL> CREATE TABLE DEPT_MASTER (
     dept_nr NUMBER ,
     dept_name varchar2(100) NOT NULL,
     dept_status NUMBER(1,0) NOT NULL,
     created_at date,
 CONSTRAINT PK_DEPT_NR PRIMARY KEY ("DEPT_NR") ); 
 Table created.

 SQL> select CONSTRAINT_NAME,INDEX_NAME,CONSTRAINT_TYPE from user_constraints where TABLE_NAME='DEPT_MASTER';
 CONSTRAINT_NAME      INDEX_NAME           CONSTRAINT_TYPE
 
 SYS_C00478609                             C
 SYS_C00478608                             C
 PK_DEPT_NR           PK_DEPT_NR           P

La tabla con Primaria se puede representar como Diagrama

Alterar tabla Agregar clave principal

Veamos cómo agregar el Primario después de la creación de la tabla

CREATE TABLE DEPT_MASTER (
     dept_nr NUMBER ,
     dept_name varchar2(100) NOT NULL,
     dept_status NUMBER(1,0) NOT NULL,
     created_at date
     );  

 SQL> alter table DEPT_MASTER add primary  key ( dept_nr);
 Table altered.

 SQL>  select CONSTRAINT_NAME,INDEX_NAME,CONSTRAINT_TYPE from user_constraints where TABLE_NAME='DEPT_MASTER';

 CONSTRAINT_NAME      INDEX_NAME           CONST
 
 SYS_C00485778                             C
 SYS_C00485779                             C
 SYS_C00485780        SYS_C00485780        P

También podemos dar nombres personalizados mientras agregamos la clave principal

SQL> alter table DEPT_MASTER add constraint DEPT_MASTER_ID  primary  key ( dept_nr);
 Table altered.
 
SQL>  select CONSTRAINT_NAME,INDEX_NAME,CONSTRAINT_TYPE from user_constraints where TABLE_NAME='DEPT_MASTER';
 CONSTRAINT_NAME      INDEX_NAME           CONST
 
 SYS_C00485778                             C
 SYS_C00485779                             C
 DEPT_MASTER_ID       DEPT_MASTER_ID       P

cómo crear una clave primaria compuesta en Oracle

Ahora veamos cómo agregar una clave principal para la clave compuesta

CREATE TABLE CUSTOMER(
    CUSTOMER_ID   NUMBER(6,0),  
    NAME VARCHAR (20)     NOT NULL,
    AGE  NUMBER(6,0)    NOT NULL,
    ADDRESS   VARCHAR2(25), 
    SALARY   NUMBER(6,0),     
    PRIMARY KEY (CUSTOMER_ID, NAME)
 );
 
 SQL> col CONSTRAINT_NAME  format a20
 SQL>  col INDEX_NAME format a20
 SQL> col CONSTRAINT_TYPE format a5
 SQL>  select CONSTRAINT_NAME,INDEX_NAME,CONSTRAINT_TYPE from user_constraints where TABLE_NAME='CUSTOMER'; 
 CONSTRAINT_NAME      INDEX_NAME           CONST
 
 SYS_C00485772                             C
 SYS_C00485773                             C
 SYS_C00485774        SYS_C00485774        P

También podemos dar el nombre personalizado para las restricciones de clave principal en la clave compuesta

SQL>CREATE TABLE CUSTOMER(
    CUSTOMER_ID   NUMBER(6,0),
    NAME VARCHAR (20)     NOT NULL,
    AGE  NUMBER(6,0)    NOT NULL,
    ADDRESS   VARCHAR2(25), SQL>
    SALARY   NUMBER(6,0),
  CONSTRAINT PK_CUSTOMER  PRIMARY KEY (CUSTOMER_ID, NAME)
 );
 Table created.
 
SQL> select CONSTRAINT_NAME,INDEX_NAME,CONSTRAINT_TYPE from user_constraints where TABLE_NAME='CUSTOMER';
 CONSTRAINT_NAME      INDEX_NAME           CONST
 
 SYS_C00485776                             C
 SYS_C00485775                             C
 PK_CUSTOMER          PK_CUSTOMER          P

El primario compuesto se puede representar como

cómo soltar la clave principal en Oracle

Podemos soltar la clave principal usando el siguiente comando. Podemos usar soltar clave principal o soltar restricciones

SQL>  select CONSTRAINT_NAME,INDEX_NAME,CONSTRAINT_TYPE from user_constraints where TABLE_NAME='DEPT_MASTER';
 CONSTRAINT_NAME      INDEX_NAME           CONST
 
 SYS_C00485778                             C
 SYS_C00485779                             C
 DEPT_MASTER_ID       DEPT_MASTER_ID       P
 
SQL> alter table DEPT_MASTER  drop  primary  key;
 Table altered.

SQL> select CONSTRAINT_NAME,INDEX_NAME,CONSTRAINT_TYPE from user_constraints where TABLE_NAME='DEPT_MASTER';
 CONSTRAINT_NAME      INDEX_NAME           CONST
 
 SYS_C00485778                             C
 SYS_C00485779                             C

SQL> alter table DEPT_MASTER add constraint DEPT_MASTER_ID  primary  key ( dept_nr);
 Table altered.

SQL>  alter table DEPT_MASTER  drop constraint DEPT_MASTER_ID;
 Table altered.

SQL>  select CONSTRAINT_NAME,INDEX_NAME,CONSTRAINT_TYPE from user_constraints where TABLE_NAME='DEPT_MASTER';
 CONSTRAINT_NAME      INDEX_NAME           CONST
 
 SYS_C00485778                             C
 SYS_C00485779                             C

Cómo habilitar/deshabilitar restricciones de clave principal

SQL> alter table DEPT_MASTER enable  primary key;  
Table altered.   

SQL>  alter table DEPT_MASTER  disable primary key;  
Table altered. 

SQL> alter table DEPT_MASTER  disable constraint DEPT_MASTER_ID;  Table altered. 

SQL> alter table DEPT_MASTER enable constraint DEPT_MASTER_ID; 
 Table altered

Cómo agregar una clave principal usando el índice

Cuando Oracle crea la clave principal, crea el índice único en esa columna de la tabla para hacer cumplir las restricciones de la clave principal. Pero si la tabla tiene un índice antes de agregar la clave principal, Oracle también puede usar ese índice para las restricciones de la clave principal. Oracle puede imponer restricciones de clave principal en índices únicos, no únicos y compuestos. Oracle utilizará el índice dependiendo de la tabla de índices que ya tenga. También podemos usar el uso de la cláusula de índice en el momento de la creación de la clave principal si queremos aplicar una restricción usando un índice en particular

SQL> create index DEPT_MASTER_IDX on DEPT_MASTER(dept_nr);
 Index created.

 SQL> alter table DEPT_MASTER add constraint DEPT_MASTER_ID  primary  key ( dept_nr) using index DEPT_MASTER_IDX;
 Table altered.

 SQL> col CONSTRAINT_NAME  format a20
 SQL> col INDEX_NAME format a20
 SQL> col CONSTRAINT_TYPE format a5
 SQL> /
 CONSTRAINT_NAME      INDEX_NAME           CONST
 
 DEPT_MASTER_ID       DEPT_MASTER_IDX      P
 SYS_C00485779                             C
 SYS_C00485778                             C

Incluso si no usamos el uso de índice en esta declaración anterior, el oráculo seguirá teniendo el mismo índice no único para hacer cumplir las restricciones de clave principal

SQL> create index DEPT_MASTER_IDX on DEPT_MASTER(dept_nr);
 Index created.
 
SQL> alter table DEPT_MASTER add constraint DEPT_MASTER_ID  primary  key ( dept_nr);
 Table altered.
 
SQL> col CONSTRAINT_NAME  format a20
 SQL> col INDEX_NAME format a20
 SQL> col CONSTRAINT_TYPE format a5
 SQL> /
 CONSTRAINT_NAME      INDEX_NAME           CONST
 
 DEPT_MASTER_ID       DEPT_MASTER_IDX      P
 SYS_C00485779                             C
 SYS_C00485778      

cómo modificar la clave principal en Oracle

No podemos simplemente modificar el valor de la clave principal. tendremos que soltar la clave anterior y crear la nueva principal. Si tenemos restricciones de clave externa que hacen referencia a esos. luego debemos soltarlos primero y soltar la clave principal y crear nuevamente la nueva clave principal

cómo incrementar automáticamente la clave principal en Oracle

Con 12c, tenemos dos formas sencillas de implementar el incremento automático para la clave principal

Columnas de identidad
En Oracle Database 12c, podemos definir columnas de tabla con la palabra clave SQL IDENTITY, que es una palabra clave SQL del American National Standards Institute (ANSI). Que se incrementan automáticamente en el momento de la inserción (como en MySQL).

Example:
create table test
(
id number generated as identity PRIMARY KEY,
name varchar2(100),
email varchar2(100),
password varchar2(100)firstname varchar2(100)lastname varchar2(100)
);

Secuencia como valor predeterminado
Con Oracle Database 12c, podemos asignar directamente nextval de secuencia como un valor predeterminado para una columna, por lo que ya no necesita crear un disparador para llenar la columna con el siguiente valor de secuencia, solo necesita declararlo con definición de tabla. Es una especie de función de incremento automático para una columna en Oracle como MySQL

Example:
create sequence tech_test_seq start with 1 increment by 1 nocycle;
create table test
(
id number default tech_test_seq.nextval primary key
name varchar(30)
);

cómo cambiar el nombre de la clave principal en Oracle

Podemos cambiar fácilmente el nombre de las restricciones de clave principal usando alter table rename sql. Esto no afecta el procesamiento y la clave externa

CREATE TABLE DEPT_MASTER (
     dept_nr NUMBER ,
     dept_name varchar2(100) NOT NULL,
     dept_status NUMBER(1,0) NOT NULL,
     created_at date
     );
alter table DEPT_MASTER add constraint DEPT_MASTER_ID primary key ( dept_nr);
Table altered.

select CONSTRAINT_NAME from user_constraints where TABLE_NAME='DEPT_MASTER' and constraint_type = 'P';
CONSTRAINT_NAME
-------------
DEPT_MASTER_ID

ALTER TABLE DEPT_MASTER RENAME CONSTRAINT DEPT_MASTER_ID TO DEPT_MASTER_ID_PK;

select CONSTRAINT_NAME from user_constraints where TABLE_NAME='DEPT_MASTER' and constraint_type = 'P';
CONSTRAINT_NAME
-------------
DEPT_MASTER_ID_PK


I hope you like the content on  primary key and it clear all doubts about the Primary Key concept. Please do provide the feedback and what else can be added in this post 

También lee
Restricción de verificación en Oracle:La restricción de verificación de Oracle se utiliza para hacer cumplir las reglas de integridad basadas en expresiones lógicas, como las comparaciones. La condición de verificación debe devolver verdadero o falso
Restricción no nula en Oracle:
Función NVL2 en Oracle:aprenda a usar la función NVL2 en Oracle con ejemplos
alterar tabla modificar columna oráculo
https://en.wikipedia.org/wiki/Primary_key

Cursos recomendados

Aquí está el agradable curso de Udemy para Oracle SQL
Oracle-Sql-Step-by-step:este curso cubre sql básico, uniones, creación de tablas y modificación de su estructura, creación de vistas, unión, unión, todo y mucho más. . Un gran curso y un curso imprescindible para principiantes de SQL
El curso completo de certificación de Oracle SQL :Este es un buen curso para cualquier persona que quiera estar preparado para trabajar con habilidades de desarrollador de SQL. Un buen curso explicado
Oracle SQL Developer:fundamentos, consejos y trucos :muchos desarrolladores utilizan la herramienta para desarrolladores Oracle Sql. Este curso nos brinda trucos y lecciones sobre cómo usarlo de manera efectiva y convertirnos en un desarrollador sql productivo
Oracle SQL Performance Tuning Masterclass 2020 :El ajuste del rendimiento es una de las habilidades críticas y más buscadas. Este es un buen curso para aprender sobre esto y comenzar a realizar ajustes de rendimiento de sql