Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Top-Abfragen zum Primärschlüssel in Oracle mit Beispielen

Wir beginnen mit einer Einführung in den Primärschlüssel in Oracle und tauchen dann in verschiedene Abfragen ein.

Einführung in den Primärschlüssel

Ein Primärschlüssel ist eine Spalte oder eine Gruppe von Spalten in der Tabelle, die eine Zeile in der Tabelle eindeutig identifiziert.

Eigenschaften des Primärschlüssels

  1. Sie dürfen keine doppelten Werte enthalten. d.h. sie sollte in der Tabelle eindeutig sein
  2. Es darf nicht null sein oder leere Zeichenfolgen enthalten
  3. Es sollte im Laufe der Zeit nicht geändert werden
  4. Wir können nur einen Primärschlüssel in der Tabelle haben

Empfehlung

  1. Es wird empfohlen, numerische Werte als Primärschlüssel zu verwenden, da dies schneller ist
  2. Alle Tabellen sollten Primärschlüssel haben

Wie man Primärschlüssel in Oracle hinzufügt

Der Primärschlüssel kann bei der Tabellenerstellung hinzugefügt oder nach der Tabellenerstellung erstellt werden.
Sehen wir uns zuerst die Tabellenerstellung an

Primärschlüssel bei der Tabellenerstellung

Sie kann auf Spalten- oder Tabellenebene definiert werden. Zusammengesetzte Primärschlüssel werden nur auf Tabellenebene definiert. Wenn Oracle den Primärschlüssel erstellt, erstellt es den eindeutigen Index für diese Spalte in der Tabelle, um die Primärschlüsseleinschränkungen durchzusetzen.

Schauen wir uns zuerst die Spaltenebene an

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

Sehen wir uns nun die Tabellenebene an

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

Wir können den benutzerdefinierten Namen der Primärschlüssel-Einschränkung auch mithilfe der Einschränkungsklausel hinzufügen, wie unten gezeigt

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

Tabelle mit Primary kann als Diagramm dargestellt werden

Tabelle ändern Primärschlüssel hinzufügen

Sehen wir uns an, wie die primäre nach der Tabellenerstellung hinzugefügt wird

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

Wir können auch benutzerdefinierte Namen vergeben, während wir den Primärschlüssel hinzufügen

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

Wie erstelle ich einen zusammengesetzten Primärschlüssel in Oracle

Schauen wir uns nun an, wie man einen Primärschlüssel für den zusammengesetzten Schlüssel hinzufügt

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

Wir können den benutzerdefinierten Namen für die Primärschlüsselbeschränkungen auch für den zusammengesetzten Schlüssel angeben

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

Das zusammengesetzte Primary kann als

dargestellt werden

Wie man den Primärschlüssel in Oracle löscht

Wir können den Primärschlüssel mit dem folgenden Befehl löschen. Wir können Drop Primary Key oder Drop Constraints verwenden

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

So aktivieren/deaktivieren Sie Primärschlüsselbeschränkungen

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

So fügen Sie den Primärschlüssel mithilfe des Index hinzu

Wenn Oracle den Primärschlüssel erstellt, erstellt es den eindeutigen Index für diese Spalte in der Tabelle, um die Primärschlüsseleinschränkungen zu erzwingen. Wenn die Tabelle jedoch vor dem Hinzufügen des Primärschlüssels einen Index hat, kann Oracle diesen Index auch für Primärschlüsseleinschränkungen verwenden. Oracle kann Primärschlüsseleinschränkungen für eindeutige, nicht eindeutige und zusammengesetzte Indizes erzwingen. Oracle verwendet den Index abhängig von der Indextabelle, die bereits vorhanden ist. Wir können auch die Verwendung der Indexklausel zum Zeitpunkt der Primärschlüsselerstellung verwenden, wenn wir eine Einschränkung mit einem bestimmten Index erzwingen möchten

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

Selbst wenn wir in dieser früheren Anweisung nicht using index verwenden, wird das Orakel immer noch denselben nicht eindeutigen Index zum Erzwingen von Primärschlüsseleinschränkungen haben

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      

Wie man den Primärschlüssel in Oracle ändert

Wir können nicht einfach den Primärschlüsselwert ändern. Wir müssen den alten Schlüssel löschen und den neuen Primärschlüssel erstellen. Wenn wir Fremdschlüsselbeschränkungen haben, die auf diese verweisen. dann müssen wir sie zuerst löschen und den Primärschlüssel löschen und den neuen Primärschlüssel erneut erstellen

Wie man den Primärschlüssel in Oracle automatisch erhöht

Mit 12c haben wir zwei einfache Möglichkeiten, die automatische Erhöhung des Primärschlüssels zu implementieren

Identitätsspalten
In Oracle Database 12c können wir Tabellenspalten mit dem SQL-Schlüsselwort IDENTITY definieren, das ein SQL-Schlüsselwort des American National Standards Institute (ANSI) ist. Die zum Zeitpunkt des Einfügens automatisch inkrementiert werden (wie 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)
);

Reihenfolge als Standardwert
Mit Oracle Database 12c können wir Sequenz nextval direkt als Standardwert für eine Spalte zuweisen. Sie müssen also keinen Trigger mehr erstellen, um die Spalte mit dem nächsten Wert von sequence zu füllen, Sie müssen ihn nur mit deklarieren Tabellendefinition. Es ist eine Art Autoinkrement-Funktion für eine Spalte in Oracle, genau wie 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)
);

wie man Primärschlüssel in Oracle umbenennt

Wir können die Primärschlüsseleinschränkungen einfach umbenennen, indem wir alter table rename sql verwenden. Dies hat keine Auswirkungen auf die Verarbeitung und den Fremdschlüssel

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 

Liest auch
Check Constraint in Oracle :Oracle Check Constraint wird verwendet, um Integritätsregeln basierend auf logischen Ausdrücken, wie z. B. Vergleichen, durchzusetzen. Die Prüfbedingung muss wahr oder falsch zurückgeben
Keine Null-Einschränkung in Oracle:
NVL2-Funktion in Oracle:Erfahren Sie anhand von Beispielen, wie Sie die NVL2-Funktion in Oracle verwenden
Tabelle ändern, Spalte ändern, Oracle
https://en.wikipedia.org/wiki/Primary_key

Empfohlene Kurse

Hier ist der nette Udemy-Kurs für Oracle SQL
Oracle-Sql-Schritt-für-Schritt :Dieser Kurs behandelt grundlegendes SQL, Joins, Erstellen von Tabellen und Ändern ihrer Struktur, Erstellen von Ansichten, Union, Union -all und vieles mehr . Ein großartiger Kurs und ein Muss für SQL-Einsteiger
Der vollständige Oracle SQL-Zertifizierungskurs :Dies ist ein guter Kurs für alle, die für SQL-Entwicklerfähigkeiten einsatzbereit werden möchten. Ein gut erklärter Kurs
Oracle SQL Developer:Grundlagen, Tipps und Tricks :Das Oracle Sql-Entwicklertool wird von vielen Entwicklern verwendet. Dieser Kurs gibt uns Tricks und Lektionen, wie man es effektiv nutzt und ein produktiver SQL-Entwickler wird
Oracle SQL Performance Tuning Masterclass 2020 :Leistungsoptimierung ist eine der wichtigsten und gefragtesten Fähigkeiten. Dies ist ein guter Kurs, um mehr darüber zu erfahren und mit der Optimierung der SQL-Leistung zu beginnen