Oracle
 sql >> Database >  >> RDS >> Oracle

Principali query sulla chiave primaria in Oracle con esempi

Inizieremo con un'introduzione alla chiave primaria in Oracle e poi ci addentreremo in varie query su di essa.

Introduzione alla chiave primaria

Una chiave primaria è una colonna o un insieme di colonne nella tabella che identifica in modo univoco una riga nella tabella.

Proprietà della chiave primaria

  1. Non puoi avere valori duplicati al suo interno. cioè dovrebbe essere univoco nella tabella
  2. Non può essere nullo o contenere stringhe vuote
  3. Non dovrebbe essere cambiato nel tempo
  4. Possiamo avere solo una chiave primaria nella tabella

Raccomandamento

  1. Si suggerisce di avere valori numerici come chiave primaria in quanto è più veloce
  2. Tutte le tabelle dovrebbero avere chiavi primarie

Come aggiungere la chiave primaria in Oracle

La chiave primaria può essere aggiunta al momento della creazione della tabella o può essere creata dopo la creazione della tabella.
Diamo prima un'occhiata alla creazione della tabella

Chiave primaria alla creazione della tabella

Può essere definito a livello di colonna o di tabella. Le chiavi primarie composite sono definite solo a livello di tabella. Quando Oracle crea la chiave primaria, crea l'indice univoco su quella colonna nella tabella per applicare i vincoli della chiave primaria.

Esaminiamo prima il livello di colonna

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

Ora vediamo per il livello Tabella

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

Possiamo dare il nome personalizzato del vincolo di chiave primaria anche usando la clausola di vincolo add come mostrato di seguito

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 tabella con Primaria può essere rappresentata come Diagramma

Modifica tabella Aggiungi chiave primaria

Vediamo come aggiungere la Primaria dopo la creazione della tabella

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

Possiamo dare nomi personalizzati anche aggiungendo la chiave primaria

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

come creare una chiave primaria composita in Oracle

Ora vediamo come aggiungere una chiave primaria per la chiave composta

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

Possiamo anche dare il nome personalizzato per i vincoli della chiave primaria sulla chiave composita

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

La primaria composita può essere rappresentata come

come eliminare la chiave primaria in Oracle

Possiamo rilasciare la chiave primaria usando il comando seguente. Possiamo usare drop primary key o drop vincoli

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

Come abilitare/disabilitare i vincoli della chiave primaria

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

Come aggiungere la chiave primaria utilizzando l'indice

Quando Oracle crea la chiave primaria, crea l'indice univoco su quella colonna nella tabella per applicare i vincoli della chiave primaria. Ma se la tabella ha un indice prima dell'aggiunta della chiave primaria, Oracle può utilizzare quell'indice anche per i vincoli della chiave primaria. Oracle può imporre vincoli di chiave primaria su indici univoci, non univoci e compositi. Oracle utilizzerà l'indice a seconda della tabella degli indici già presente. Possiamo anche usare l'utilizzo della clausola index al momento della creazione della chiave primaria anche se vogliamo imporre il vincolo usando un particolare indice

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

Anche se non usiamo using index in questa affermazione precedente, l'oracle avrà comunque lo stesso indice non univoco per far rispettare i vincoli della chiave primaria

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      

come modificare la chiave primaria in Oracle

Non possiamo semplicemente modificare il valore della chiave primaria. dovremo eliminare la vecchia chiave e creare la nuova primaria. Se abbiamo vincoli di chiave esterna che fanno riferimento a quelli. quindi dobbiamo prima rilasciarli e rilasciare la chiave primaria e creare di nuovo la nuova chiave primaria

come incrementare automaticamente la chiave primaria in Oracle

Con 12c, abbiamo due semplici modi per implementare l'incremento automatico per la chiave primaria

Colonne identità
In Oracle Database 12c, possiamo definire le colonne della tabella con la parola chiave SQL IDENTITY che è una parola chiave SQL dell'American National Standards Institute (ANSI). Che vengono incrementati automaticamente al momento dell'inserimento (come in 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)
);

Sequenza come valore predefinito
Con Oracle Database 12c, possiamo assegnare direttamente la sequenza nextval come valore predefinito per una colonna, quindi non è più necessario creare un trigger per popolare la colonna con il valore successivo della sequenza, devi solo dichiararlo con definizione della tabella. È una sorta di funzione di incremento automatico per una colonna in Oracle proprio come 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)
);

come rinominare la chiave primaria in Oracle

Possiamo facilmente rinominare i vincoli della chiave primaria usando alter table rename sql. Ciò non influisce sull'elaborazione e sulla chiave esterna

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 

Legge anche
Check Constraint in Oracle:Oracle Check Constraint viene utilizzato per applicare regole di integrità basate su espressioni logiche, come i confronti. La condizione di controllo deve restituire true o false
vincolo Not Null in Oracle:
Funzione NVL2 in Oracle:scopri come utilizzare la funzione NVL2 in Oracle con esempi
alter table, modificare la colonna oracle
https://en.wikipedia.org/wiki/Primary_key

Corsi consigliati

Ecco il bel corso Udemy per Oracle SQL
Oracle-Sql-Step-by-step:questo corso copre SQL di base, join, creazione di tabelle e modifica della sua struttura, creazione di viste, unione, unione, tutto e molto altro . Un ottimo corso e un corso indispensabile per principianti SQL
Il corso completo di certificazione Oracle SQL :Questo è un buon corso per chiunque voglia essere pronto per il lavoro per le competenze di sviluppatore SQL. Un bel corso spiegato
Oracle SQL Developer:Essentials, Tips and Tricks :lo strumento di sviluppo Oracle Sql è utilizzato da molti sviluppatori. Questo corso offre trucchi e lezioni su come utilizzarlo in modo efficace e diventare uno sviluppatore sql produttivo
Oracle SQL Performance Tuning Masterclass 2020 :l'ottimizzazione delle prestazioni è una delle abilità critiche e più ricercate. Questo è un buon corso per conoscerlo e iniziare a ottimizzare le prestazioni di sql