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
- Non puoi avere valori duplicati al suo interno. cioè dovrebbe essere univoco nella tabella
- Non può essere nullo o contenere stringhe vuote
- Non dovrebbe essere cambiato nel tempo
- Possiamo avere solo una chiave primaria nella tabella
Raccomandamento
- Si suggerisce di avere valori numerici come chiave primaria in quanto è più veloce
- 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