sql >> Databasteknik >  >> RDS >> Oracle

Toppfrågor på primärnyckel i Oracle med exempel

Vi börjar med en introduktion till primärnyckeln i Oracle och sedan kommer vi att dyka ner i olika frågor om den.

Introduktion till primärnyckel

En primärnyckel är en kolumn eller uppsättning kolumner i tabellen som unikt identifierar en rad i tabellen.

Egenskaper för primär nyckel

  1. Du kan inte ha dubbletter av värden. dvs det ska vara unikt i tabellen
  2. Det får inte vara null eller innehålla tomma strängar
  3. Det bör inte ändras med tiden
  4. Vi kan bara ha en primärnyckel i tabellen

Rekommendation

  1. Det rekommenderas att ha numeriska värden som primärnyckel eftersom det är snabbare
  2. Alla tabeller bör ha primärnycklar

Hur man lägger till primärnyckel i Oracle

Den primära nyckeln kan läggas till vid skapandet av tabeller eller kan skapas efter tabellskapandet.
Låt oss först kolla in tabellskapandet

Primärnyckel vid skapande av bord

Det kan definieras på kolumnnivå eller tabellnivå. Sammansatta primärnycklar definieras endast på tabellnivå. När Oracle skapar primärnyckeln skapar det det unika indexet på den kolumnen i tabellen för att upprätthålla primärnyckelns begränsningar.

Låt oss först kolla in kolumnnivån

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

Låt oss nu se för tabellnivå

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

Vi kan ge det anpassade namnet på primärnyckelrestriktionen också genom att använda add constraint-satsen som visas nedan

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

Tabell med primär kan representeras som diagram

Ändra tabell Lägg till primär nyckel

Låt oss se hur du lägger till den primära efter tabellskapandet

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

Vi kan också ge anpassade namn samtidigt som vi lägger till primärnyckeln

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

hur man skapar en sammansatt primärnyckel i Oracle

Låt oss nu kolla in hur man lägger till en primärnyckel för den sammansatta nyckeln

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

Vi kan också ge det anpassade namnet för primärnyckelns restriktioner på den sammansatta nyckeln

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

Den sammansatta primära kan representeras som

hur man släpper primärnyckeln i Oracle

Vi kan släppa primärnyckeln med kommandot nedan. Vi kan använda släpp primärnyckel eller släppbegränsningar

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

Hur man aktiverar/inaktiverar primärnyckelbegränsningar

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

Hur man lägger till primärnyckel med hjälp av Index

När Oracle skapar primärnyckeln skapar det det unika indexet på den kolumnen i tabellen för att upprätthålla primärnyckelns begränsningar. Men om tabellen har ett index före tillägget av den primära nyckeln, kan Oracle också använda det indexet för primärnyckelrestriktioner. Oracle kan genomdriva primära nyckelbegränsningar på både unika, icke-unika och sammansatta index. Oracle kommer att använda indexet beroende på vilka indextabeller som redan har. Vi kan också använda indexklausul när primärnyckeln skapas, även om vi vill upprätthålla begränsningar med ett visst 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

Även om vi inte använder index i detta tidigare uttalande, kommer oraklet fortfarande att ha samma icke-unika index för att upprätthålla primärnyckelbegränsningar

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      

hur man ändrar primärnyckeln i Oracle

Vi kan inte bara ändra det primära nyckelvärdet. vi kommer att behöva släppa den gamla nyckeln och skapa den nya primära. Om vi ​​har främmande nyckelbegränsningar som refererar till dessa. då måste vi släppa dem först och släppa primärnyckeln och skapa den nya primärnyckeln igen

hur man automatiskt ökar primärnyckeln i Oracle

Med 12c har vi två enkla sätt att implementera automatisk ökning för primärnyckel

Identitetskolumner
I Oracle Database 12c kan vi definiera tabellkolumner med SQL-nyckelordet IDENTITY som är ett SQL-nyckelord från American National Standards Institute (ANSI). Som automatiskt inkrementeras vid tidpunkten för insättningen (som i 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)
);

Sekvens som standardvärde
Med Oracle Database 12c kan vi direkt tilldela sekvens nextval som ett standardvärde för en kolumn, så du behöver inte längre skapa en trigger för att fylla kolumnen med nästa värde i sekvensen, du behöver bara deklarera det med tabelldefinition. Det är en sorts automatisk inkrementfunktion för en kolumn i oracle precis som 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)
);

hur man byter namn på primärnyckeln i Oracle

Vi kan enkelt byta namn på primärnyckelbegränsningarna genom att använda alter table rename sql. Detta påverkar inte bearbetningen och den främmande nyckeln

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 

Läser också
Check Constraint i Oracle :Oracle Check Constraint används för att genomdriva integritetsregler baserade på logiska uttryck, som jämförelser. Kontrollvillkoret måste returnera sant eller falskt
Not Null-begränsning i Oracle:
NVL2-funktion i Oracle:Lär dig hur du använder NVL2-funktionen i Oracle med exempel
ändra tabell modifiera kolumn-oracle
https://en.wikipedia.org/wiki/Primary_key

Rekommenderade kurser

Här är den trevliga Udemy-kursen för Oracle SQL
Oracle-Sql-Steg-för-steg :Den här kursen täcker grundläggande sql, joins, Skapa tabeller och ändra dess struktur, Skapa vy, Union, Union -allt och mycket annat . En bra kurs och måste-kurs för SQL-startare
The Complete Oracle SQL Certification Course :Det här är en bra kurs för alla som vill vara redo för SQL-utvecklare. En trevlig förklarad kurs
Oracle SQL Developer:Essentials, Tips and Tricks :Oracle Sql-utvecklarverktyget används av många utvecklare. Den här kursen ger oss tricks och lektioner om hur man effektivt använder den och blir en produktiv SQL-utvecklare
Oracle SQL Performance Tuning Masterclass 2020 :Prestandajustering är en av de kritiska och mest eftertraktade färdigheterna. Det här är en bra kurs för att lära dig om det och börja göra sql-prestandajustering


  1. hur man lägger till andra i oracle tidsstämpel

  2. vad är problemet med AttachDbFilename

  3. Gå med i frågan med endast kolumner som har alla värden i "in"-satsen

  4. NLS_CHARSET_DECL_LEN() Funktion i Oracle