sql >> データベース >  >> RDS >> Oracle

例を使用したOracleの主キーに関する上位クエリ

    オラクルの主キーの概要から始めて、それに関するさまざまなクエリについて詳しく説明します。

    主キーの概要

    主キーは、テーブル内の行を一意に識別するテーブル内の列または列のセットです。

    主キーのプロパティ

    1. 重複する値を含めることはできません。つまり、テーブル内で一意である必要があります
    2. nullまたは空の文字列を含めることはできません
    3. 時間の経過とともに変更しないでください
    4. テーブルに含めることができる主キーは1つだけです

    推奨事項

    1. 高速であるため、主キーとして数値を使用することをお勧めします
    2. すべてのテーブルに主キーが必要です

    Oracleに主キーを追加する方法

    主キーは、テーブルの作成時に追加することも、テーブルの作成後に作成することもできます。
    最初にテーブルの作成を確認しましょう

    テーブル作成時の主キー

    列レベルまたはテーブルレベルで定義できます。複合主キーは、テーブルレベルでのみ定義されます。オラクルが主キーを作成すると、テーブル内のその列に一意のインデックスが作成され、主キーの制約が適用されます。

    最初に列レベルを確認しましょう

    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

    それでは、テーブルレベルを見てみましょう

    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

    以下に示すように、addconstraint句を使用して主キー制約のカスタム名を付けることもできます

    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

    プライマリのあるテーブルは、ダイアグラムとして表すことができます

    ALTER TABLE Add Primary Key

    テーブル作成後にプライマリを追加する方法を見てみましょう

    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

    主キーを追加しながらカスタム名を付けることもできます

    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

    Oracleで複合主キーを作成する方法

    それでは、複合キーの主キーを追加する方法を確認しましょう

    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

    複合キーの主キー制約にカスタム名を付けることもできます

    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

    複合プライマリは次のように表すことができます

    Oracleで主キーを削除する方法

    以下のコマンドを使用して、主キーを削除できます。ドロップ主キーまたはドロップ制約を使用できます

    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

    主キー制約を有効/無効にする方法

    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

    インデックスを使用して主キーを追加する方法

    オラクルが主キーを作成するとき、テーブルのその列に一意の索引を作成して、主キーの制約を適用します。ただし、主キーを追加する前にテーブルにインデックスがある場合、Oracleはそのインデックスを主キーの制約にも使用できます。 Oracleは、一意、非一意、および複合インデックスの両方に主キー制約を適用できます。 Oracleは、テーブルにすでにあるインデックスに応じてインデックスを使用します。特定のインデックスを使用して制約を適用する場合にも、主キーの作成時にusingindex句を使用することもできます

    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

    この前のステートメントでインデックスの使用を使用しない場合でも、オラクルには、主キー制約を適用するための同じ非一意のインデックスがあります

    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      

    Oracleで主キーを変更する方法

    主キーの値を変更するだけでは不十分です。古いキーを削除して、新しいプライマリを作成する必要があります。それらを参照する外部キー制約がある場合。次に、最初にそれらを削除し、主キーを削除して、新しい主キーを再度作成する必要があります

    Oracleで主キーを自動インクリメントする方法

    12cでは、主キーの自動インクリメントを実装する2つの簡単な方法があります

    ID列
    Oracle Database 12cでは、American National Standards Institute(ANSI)のSQLキーワードであるSQLキーワードIDENTITYを使用してテーブル列を定義できます。これは挿入時に自動インクリメントされます(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)
    );
    
    

    デフォルト値としてのシーケンス
    Oracle Database 12cでは、列のデフォルト値としてシーケンスnextvalを直接割り当てることができるため、列にシーケンスの次の値を入力するトリガーを作成する必要はなく、次のように宣言する必要があります。テーブル定義。これは、MySQLと同じように、Oracleの列の一種の自動インクリメント機能です

    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)
    );
    
    を作成します。

    Oracleで主キーの名前を変更する方法

    alter table rename sqlを使用して、主キー制約の名前を簡単に変更できます。これは、処理と外部キーには影響しません

    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 

    また読む
    Oracleのチェック制約:Oracleチェック制約は、比較などの論理式に基づいて整合性ルールを適用するために使用されます。チェック条件はtrueまたはfalseを返す必要があります
    Oracleの非NULL制約:
    OracleのNVL2関数:例を使用してOracleのNVL2関数の使用方法を学習します
    alter table modify column oracle
    https://en.wikipedia.org/wiki/Primary_key

    推奨コース

    OracleSQLの優れたUdemyコースは次のとおりです。
    Oracle-Sql-ステップバイステップ:このコースでは、基本的なSQL、結合、テーブルの作成とその構造の変更、ビューの作成、ユニオン、ユニオンなどすべてについて説明します。 。 SQL初心者のための素晴らしいコースと必須のコース
    完全なOracleSQL認定コース :これは、SQL開発者のスキルに対応できるようになりたい人にとっては良いコースです。わかりやすい説明コース
    OracleSQLDeveloper:Essentials、Tips and Tricks :OracleSql開発者ツールは多くの開発者によって使用されています。このコースでは、それを効果的に使用して生産的なSQL開発者になるための秘訣とレッスンを提供します。
    Oracle SQL Performance Tuning Masterclass 2020 :パフォーマンスの調整は、重要で最も求められているスキルの1つです。これは、それについて学び、SQLパフォーマンスの調整を開始するための良いコースです


    1. Postgresの大文字と小文字の区別

    2. SQLServerのすべてのテーブルを検索して文字列を検索します

    3. SQLServerのselectステートメントでTOPを使用して変数を動的にせずに使用する

    4. 週番号を使用してMySqlで週の最初の日を取得する