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

例を使用したOracleの一意キー

    一意キーとは

    Oracleの一意キーデータベース内のすべての行を一意に識別します。基本的に、定義された列に一意性を適用します
    重要事項

    1. テーブルごとに複数の一意キーが存在する可能性があります
    2. 1つ以上の列で定義できます
    3. 一意キーを構成する列はnull可能である可能性があります

    一意キーの作成方法

    テーブルの作成

    これは、Oracleのcreatetableコマンドを使用して列レベルで実行できます

    SQL> CREATE TABLE DEPT_MASTER (
         dept_nr NUMBER UNIQUE,
         dept_name varchar2(100) NOT NULL,
         dept_status NUMBER(1,0) NOT NULL,
         created_at date
         );
     Table created.
    
     SQL> column  CONSTRAINT_NAME format a20
     SQL> column TABLE_NAME  format a20
     SQL> column INDEX_NAME format a20
     SQL> select CONSTRAINT_NAME,CONSTRAINT_TYPE,TABLE_NAME,
       INDEX_NAME   from  user_Constraints where 
       TABLE_NAME='DEPT_MASTER';

    テーブルレベルでも実行できます

    SQL> CREATE TABLE DEPT_MASTER (
         dept_nr NUMBER ,
         dept_name varchar2(100) NOT NULL,
         dept_status NUMBER(1,0) NOT NULL,
         created_at date,
         Unique(dept_nr) );
     Table created.
    
     SQL> select CONSTRAINT_NAME,CONSTRAINT_TYPE,TABLE_NAME,
         INDEX_NAME from  user_Constraints where 
         TABLE_NAME='DEPT_MASTER';

    カスタム制約も提供できます

    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 DEPT_UK Unique(dept_nr)      
           ); 
     Table created.
    
     SQL> select CONSTRAINT_NAME,CONSTRAINT_TYPE,TABLE_NAME,
        INDEX_NAME    from  user_Constraints 
         where      TABLE_NAME='DEPT_MASTER';

    下の図で一意キーを表すことができます

    複数の列、つまり複合一意キーを使用することもでき、テーブルレベルでのみ定義されます

    CREATE TABLE CUSTOMER_DETAIL
    (
    CUSTOMER_ID   NUMBER(6,0),  
    NAME VARCHAR (20)     NOT NULL,
    AGE  NUMBER(6,0)      NOT NULL,
    ADDRESS   VARCHAR2(25), 
    SALARY   NUMBER(6,0),     
    UNIQUE(CUSTOMER_ID, NAME)
    );
    Table Created.
    
    SQL> select CONSTRAINT_NAME,CONSTRAINT_TYPE,
        TABLE_NAME,INDEX_NAME from  user_Constraints where 
        TABLE_NAME='CUSTOMER_DETAIL';

    カスタム制約名を付けることもできます

    SQL> CREATE TABLE CUSTOMER_DETAIL(
         CUSTOMER_ID   NUMBER(6,0),
         NAME VARCHAR (20)     NOT NULL,
         AGE  NUMBER(6,0)    NOT NULL,
         ADDRESS   VARCHAR2(25),
         SALARY   NUMBER(6,0),
        constraint  CUSTOMER_UK UNIQUE(CUSTOMER_ID, NAME)
         );
       
     Table created.
    
     SQL> select CONSTRAINT_NAME,CONSTRAINT_TYPE,
         TABLE_NAME,INDEX_NAME from  user_Constraints where      TABLE_NAME='CUSTOMER_DETAIL';

    テーブルを変更して一意のキーを追加

    テーブルの作成後に一意キーを追加することもできます。その例を見てみましょう

    SQL> CREATE TABLE CUSTOMER_DETAIL(
        CUSTOMER_ID   NUMBER(6,0),
        NAME VARCHAR (20)     NOT NULL,
        AGE  NUMBER(6,0)    NOT NULL,
        ADDRESS   VARCHAR2(25),
        SALARY   NUMBER(6,0)
         ); 
     Table created.
    
     SQL>  select CONSTRAINT_NAME,CONSTRAINT_TYPE,
         TABLE_NAME,INDEX_NAME from  user_Constraints where    TABLE_NAME='CUSTOMER_DETAIL';
     SQL> alter table customer_detail add constraint 
          customer_uk UNIQUE(CUSTOMER_ID, NAME);
     Table altered.
    
     SQL> select CONSTRAINT_NAME,CONSTRAINT_TYPE,TABLE_NAME,INDEX_NAME from  user_Constraints where TABLE_NAME='CUSTOMER_DETAIL';

    主キーと一意キーの両方

    oracleテーブルに主キーと一意キーの両方を含めることができます。これはそれを示す例です

    SQL>  CREATE TABLE DEPT_MASTER (
          dept_nr NUMBER PRIMARY KEY,
          dept_name varchar2(100) UNIQUE,
          dept_status NUMBER(1,0) NOT NULL,
          created_at date  
          );
     Table created.
    
     SQL> select CONSTRAINT_NAME,CONSTRAINT_TYPE,
         TABLE_NAME,INDEX_NAME  from  
          user_Constraints where   TABLE_NAME='DEPT_MASTER';

    一意キーに関連付けられた列を見つける方法

    辞書ビューUser_cons_columns

    から、主キーまたは一意キーに関連付けられた列を見つけることができます。
    SQL>  CREATE TABLE DEPT_MASTER (
          dept_nr NUMBER PRIMARY KEY,
          dept_name varchar2(100) UNIQUE,
          dept_status NUMBER(1,0) NOT NULL,
          created_at date  
          );
     Table created.
    
     SQL> select CONSTRAINT_NAME,CONSTRAINT_TYPE,
         TABLE_NAME,INDEX_NAME  from  
          user_Constraints where   TABLE_NAME='DEPT_MASTER';
     SQL> SELECT Constraint_name, Table_name, Column_name FROM User_cons_columns where CONSTRAINT_NAME ='SYS_C00540915';  
     CONSTRAINT_NAME      TABLE_NAME     COLUMN_NAME
     -------------------- -----------   ------------
     SYS_C00540915        DEPT_MASTER   DEPT_NAME
    
     SQL> SELECT Constraint_name, Table_name, Column_name
         FROM User_cons_columns where CONSTRAINT_NAME ='SYS_C00540914'; 
     CONSTRAINT_NAME      TABLE_NAME           COLUMN_NAME
     -------------         ---------            ---------
     SYS_C00540914        DEPT_MASTER          DEPT_NR
     SQL> SELECT Constraint_name, Table_name, Column_name
         FROM User_cons_columns where CONSTRAINT_NAME ='SYS_C00540918';
     CONSTRAINT_NAME      TABLE_NAME           COLUMN_NAME
     -------------        ----------          ------------
     SYS_C00540918        CUSTOMER_DETAIL      CUSTOMER_ID
     SYS_C00540918        CUSTOMER_DETAIL      NAME 

    一意キー制約を有効または無効にする方法

    これは、altertableコマンドで実行できます。列名または制約名のいずれかを指定できます

    SQL>  alter table customer_detail disable UNIQUE(CUSTOMER_ID, NAME);
     Table altered.
     SQL> alter table customer_detail disable constraint  CUST_UK;
     Table altered.
     SQL> alter table customer_detail enable  UNIQUE(CUSTOMER_ID, NAME);
     Table altered.
     SQL>  alter table customer_detail enable constraint  CUST_UK;
     Table altered.

    一意の制約を削除する方法

    これは、altertableコマンドで実行できます。列名または制約名のいずれかを指定できます

    SQL> alter table customer_detail drop  UNIQUE(CUSTOMER_ID, NAME);
     Table altered.
     OR
     SQL> alter table customer_detail drop constraint  CUST_UK;
     Table altered.

    Oracleの一意キーに関するこの詳細が気に入っていただければ幸いです。実証目的でも十分な例を示しました。フィードバックをお寄せください

    また読む

    Oracleデータベース管理チュートリアル
    Oracleに主キーを追加する方法:主キーは、テーブル内の行を一意に識別します。 Oracleで主キーを追加する方法、主キーを削除する方法、複合キーを作成する方法
    https://asktom.oracle.com/pls/asktom/f%3Fp%3D100:11:0::::P11_QUESTION_ID:5541352100346689891


    1. リレーショナルデータベースのカスタムフィールドのデザインパターン

    2. CTEから挿入

    3. MySQLで日時またはタイムスタンプのデータ型を使用する必要がありますか?

    4. サブフォームを使用したTreeViewコントロール