sql >> Database >  >> RDS >> Oracle

Topvragen over primaire sleutel in Oracle met voorbeelden

We beginnen met een inleiding tot de primaire sleutel in orakel en daarna duiken we in verschillende vragen hierover.

Inleiding tot de primaire sleutel

Een primaire sleutel is een kolom of reeks kolommen in de tabel die op unieke wijze een rij in de tabel identificeert.

Eigenschappen van primaire sleutel

  1. Je kunt er geen dubbele waarden in hebben. d.w.z. het moet uniek zijn in de tabel
  2. Het mag niet null zijn of lege tekenreeksen bevatten
  3. Het mag in de loop van de tijd niet worden gewijzigd
  4. We kunnen maar één primaire sleutel in de tabel hebben

Aanbeveling

  1. Het wordt aanbevolen om numerieke waarden als primaire sleutel te gebruiken omdat dit sneller is
  2. Alle tabellen moeten primaire sleutels hebben

Hoe een primaire sleutel in orakel toe te voegen

De primaire sleutel kan worden toegevoegd bij het maken van de tafel of kan worden gemaakt na het maken van de tafel.
Laten we eerst uitchecken voor het maken van een tafel

Primaire sleutel bij het maken van een tafel

Het kan worden gedefinieerd op kolom- of tabelniveau. Samengestelde primaire sleutels worden alleen op tabelniveau gedefinieerd. Wanneer orakel de primaire sleutel maakt, wordt de unieke index voor die kolom in de tabel gemaakt om de beperkingen van de primaire sleutel af te dwingen.

Laten we eerst het kolomniveau bekijken

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

Laten we nu eens kijken voor tafelniveau

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

We kunnen de aangepaste naam van de primaire sleutelbeperking ook geven met de add constraint-clausule zoals hieronder weergegeven

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

Tabel met primair kan worden weergegeven als diagram

Tabel wijzigen Primaire sleutel toevoegen

Laten we eens kijken hoe we de Primary kunnen toevoegen nadat de tabel is gemaakt

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

We kunnen ook aangepaste namen geven terwijl we de primaire sleutel toevoegen

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

hoe maak je een samengestelde primaire sleutel in oracle

Laten we nu eens kijken hoe we een primaire sleutel voor de samengestelde sleutel kunnen toevoegen

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

We kunnen de aangepaste naam voor de primaire sleutelbeperkingen ook op de samengestelde sleutel geven

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

De samengestelde Primary kan worden weergegeven als

hoe de primaire sleutel in orakel te laten vallen

We kunnen de primaire sleutel laten vallen met behulp van de onderstaande opdracht. We kunnen drop-primaire sleutel of drop-beperkingen gebruiken

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

Hoe primaire sleutelbeperkingen in-/uitschakelen

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

Hoe een primaire sleutel toe te voegen met behulp van de index

Wanneer orakel de primaire sleutel maakt, wordt de unieke index voor die kolom in de tabel gemaakt om de beperkingen van de primaire sleutel af te dwingen. Maar als de tabel een index heeft voordat de primaire sleutel is toegevoegd, kan Oracle die index ook gebruiken voor primaire sleutelbeperkingen. Oracle kan primaire sleutelbeperkingen afdwingen op zowel unieke, niet-unieke als samengestelde indexen. Oracle zal de index gebruiken, afhankelijk van de indexentabel die er al is. We kunnen ook de indexclausule gebruiken tijdens het maken van de primaire sleutel, ook als we beperking willen afdwingen met behulp van een bepaalde index

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

Zelfs als we het gebruik van index in deze eerdere verklaring niet gebruiken, heeft het orakel nog steeds dezelfde niet-unieke index voor het afdwingen van primaire sleutelbeperkingen

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      

hoe de primaire sleutel in orakel te wijzigen

We kunnen niet zomaar de waarde van de primaire sleutel wijzigen. we zullen de oude sleutel moeten laten vallen en de nieuwe primaire moeten maken. Als we externe sleutelbeperkingen hebben die ernaar verwijzen. dan moeten we ze eerst laten vallen en de primaire sleutel laten vallen en opnieuw de nieuwe primaire sleutel maken

hoe de primaire sleutel automatisch te verhogen in orakel

Met 12c hebben we twee eenvoudige manieren om automatische verhoging voor primaire sleutel te implementeren

Identiteitskolommen
In Oracle Database 12c kunnen we tabelkolommen definiëren met het SQL-sleutelwoord IDENTITY, een SQL-sleutelwoord van het American National Standards Institute (ANSI). Die automatisch worden verhoogd op het moment van invoegen (zoals 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)
);

Opeenvolging als standaardwaarde
Met Oracle Database 12c kunnen we sequence nextval direct toewijzen als standaardwaarde voor een kolom. U hoeft dus niet langer een trigger te maken om de kolom te vullen met de volgende waarde van sequence, u hoeft het alleen maar aan te geven met tabel definitie. Het is een soort auto-increment-functie voor een kolom in Oracle, net als 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)
);

hoe de primaire sleutel in orakel te hernoemen

We kunnen de primaire-sleutelbeperkingen gemakkelijk hernoemen met behulp van alter table rename sql. Dit heeft geen invloed op de verwerking en de refererende sleutel

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 

Leest ook
Check Constraint in Oracle :Oracle Check Constraint wordt gebruikt om integriteitsregels af te dwingen op basis van logische uitdrukkingen, zoals vergelijkingen. De controlevoorwaarde moet true of false retourneren
Niet Null-beperking in Oracle:
NVL2-functie in Oracle:leer hoe u de NVL2-functie in Oracle gebruikt met voorbeelden
tabel wijzigen kolom Oracle
https://en.wikipedia.org/wiki/Primary_key

Aanbevolen cursussen

Hier is de mooie Udemy-cursus voor Oracle SQL
Oracle-Sql-Step-voor-stap:deze cursus behandelt basis-sql, joins, tabellen maken en de structuur wijzigen, weergave maken, Union, Union -alles en nog veel meer . Een geweldige cursus en een must-have cursus voor SQL-starters
De complete Oracle SQL-certificeringscursus :Dit is een goede cursus voor iedereen die Job-klaar wil zijn voor SQL-ontwikkelaarsvaardigheden. Een mooi uitgelegde cursus
Oracle SQL Developer:Essentials, Tips and Tricks :Oracle Sql-ontwikkelaarstool wordt door veel ontwikkelaars gebruikt. Deze cursus geeft ons trucs en lessen om het effectief te gebruiken en een productieve sql-ontwikkelaar te worden
Oracle SQL Performance Tuning Masterclass 2020 :Het afstemmen van prestaties is een van de kritische en meest gezochte vaardigheden. Dit is een goede cursus om erover te leren en te beginnen met het afstemmen van sql-prestaties


  1. Is er een prestatieverschil tussen CTE, subquery, tijdelijke tabel of tabelvariabele?

  2. Een SQL Server-database herstellen (T-SQL)

  3. Rol bestaat niet en kan geen database maken bij gebruik van PostgreSQL

  4. MariaDB BEHALVE Operator uitgelegd