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

Oracleデータベースのテーブル変更列を変更します

    私たち を使用してテーブルの列のデータ型を変更できます Oracleのテーブル変更列の変更

    ALTER TABLE table_name
    MODIFY column_name <action>;

    アクションは次のようになります。
    (a)データ型を変更する
    (b)データ型を短縮または拡大する
    (c)デフォルト値を変更する
    (d)に変更するnullを許可するかnullを許可しない
    (e)列の可視性
    (d)仮想列の変更
    1つずつ始めましょう

    OracleMODIFY列変更データ型

    列が空の場合にのみ、列変更データ型を変更できます

    SQL> CREATE TABLE Books_master
    ( Book_Id NUMBER(6,0),
    Title VARCHAR2(50),
    Author VARCHAR2(50),
    ISBN VARCHAR2(25),
    BCost NUMBER(6,0),
    Publish_Year NUMBER(4,0),
    CONSTRAINT Books_master_PK PRIMARY KEY (Book_Id),
    CONSTRAINT Books_master_UK1 UNIQUE (Title, Author),
    CONSTRAINT Books_master_UK2 UNIQUE (ISBN)
    ) ;
    Table Created

    テーブルが空なので、列変更データ型を変更できます

    SQL> alter table Books_master modify ISBN NUMBER(6,0);
    Table altered.
    SQL> alter table Books_master modify ISBN VARCHAR2(25);
    Table altered.

    データを挿入しましょう

    SQL> INSERT INTO Books_master (Book_Id, Title, Author, ISBN, BCost, Publish_Year) VALUES (10, 'Complete/Convenient', 'Ketan Bhagat', 'ISBN 978-93-80349-92-3', 195, 2013);
    1 row created.
    commit;

    次に、列を変更してデータ型を変更してみてください

    SQL> alter table Books_master modify ISBN NUMBER(6,0);
    alter table Books_master modify ISBN NUMBER(6,0)
    *
    ERROR at line 1:
    ORA-01439: column to be modified must be empty to change datatype

    これで、その列をnullにして、このステートメントを正常に実行できます

    SQL> update Books_master set ISBN=null;
    1 row updated.
    SQL> commit;
    Commit complete.
    SQL> alter table Books_master modify ISBN NUMBER(6,0);
    Table altered.

    データを保持したい場合の対処方法は複数あります
    (a)新しいデータ型として新しい列を追加し、この列にデータをコピーし、古い列を削除し、新しい列の名前を実際の列名に変更します:

    alter table books_master add ISBN1 number;
    update books_master set ISBN1=to_number(ISBN);
    alter table drop column ISBN;
    alter table rename column ISBN1 to ISBN;

    (b)DBMS_REDEFINITIONを使用して、新しい列でテーブルを再構築します

    Oracle MODIFY列データ型を短縮または拡大します(テーブルの変更列サイズを変更しますoracle)

    これは、VARCHARバイトまたは文字を変更する場合に使用されます。

    ここでは、VARCHARの長さを50から100に増やしています

    SQL> alter table Books_master modify title VARCHAR2(100);
    Table altered.

    ここで、長さを100から10に短縮しようとしている場合

    SQL> alter table Books_master modify title VARCHAR2(10);
    alter table Books_master modify title VARCHAR2(10)
    *
    ERROR at line 1:
    ORA-01441: cannot decrease column length because some value is too big

    これは、既存のデータがそのサイズに収まらないために発生します。したがって、長さを増やすか、その列を更新することができます

    SQL> alter table Books_master modify title VARCHAR2(20);
    Table altered.

    OracleMODIFY列のデフォルト値

    列のデフォルト値を変更する必要がある場合

    SQL> alter table BOOKS_MASTER modify BCOST default 1000;
    Table altered.

    次回、挿入が発生してBCOSTがnullの場合、デフォルト値は1000になります

    alter table BOOKS_MASTER modify BCOST default 1000;
    Table altered.
    
    SQL> INSERT INTO Books_master (Book_Id, Title, Author, ISBN,Publish_Year) VALUES (21, 'Deception', 'Dan', 123,2001);
    1 row created.
    SQL> commit;
    Commit complete.
    
    SQL> select BCOST from Books_master where book_id=21;
    BCOST
    -----
    1000

    OracleMODIFY列がNULLまたはNOTNULL

    nullまたはnullを許可しないように列を変更できます

    SQL> desc books_master
    Name Null? Type
    ---- ---   ----
    BOOK_ID NOT NULL NUMBER(6)
    TITLE VARCHAR2(20)
    AUTHOR VARCHAR2(50)
    ISBN NUMBER(6)
    BCOST NOT NULL NUMBER(6)
    PUBLISH_YEAR NUMBER(4)
    
    SQL> alter table BOOKS_MASTER modify PUBLISH_YEAR not null;
    Table altered.
    
    SQL> desc books_master
    Name Null? Type
    ---- ----  -----
    BOOK_ID NOT NULL NUMBER(6)
    TITLE VARCHAR2(20)
    AUTHOR VARCHAR2(50)
    ISBN NUMBER(6)
    BCOST NOT NULL NUMBER(6)
    PUBLISH_YEAR NOT NULL NUMBER(4)

    null以外に変更する場合は、既存の値が必要です。そうでない場合、これは失敗します

    OracleMODIFY列の可視性

    列の変更で列の可視性を変更できます

    SQL> desc books_master
    Name Null? Type
    ---- ---- -----
    BOOK_ID NOT NULL NUMBER(6)
    TITLE VARCHAR2(20)
    AUTHOR VARCHAR2(50)
    ISBN NUMBER(6)
    BCOST NOT NULL NUMBER(6)
    PUBLISH_YEAR NOT NULL NUMBER(4)
    
    SQL> alter table BOOKS_MASTER modify PUBLISH_YEAR invisible;
    Table altered.
    
    Now the column become invisible
    
    SQL> desc books_master
    Name Null? Type
    ---- ----  ----
    BOOK_ID NOT NULL NUMBER(6)
    TITLE VARCHAR2(20)
    AUTHOR VARCHAR2(50)
    ISBN NUMBER(6)
    BCOST NOT NULL NUMBER(6)
    
    SQL> alter table BOOKS_MASTER modify PUBLISH_YEAR visible;
    Table altered.
    
    Now the column become visible
    SQL> desc books_master
    Name Null? Type
    --- ----- -----
    BOOK_ID NOT NULL NUMBER(6)
    TITLE VARCHAR2(20)
    AUTHOR VARCHAR2(50)
    ISBN NUMBER(6)
    BCOST NOT NULL NUMBER(6)
    PUBLISH_YEAR NOT NULL NUMBER(4)

    oraclealtertableのこの投稿が列を変更するのが好きだといいのですが。フィードバックを提供してください

    また読む
    alter table add column oracle
    alter table rename column oracle
    drop column in oracle
    https://docs.oracle.com/cd/B28359_01/server.111/b28286/ statement_3001.htm


    1. Flask、Connexion、SQLAlchemyを使用したPython REST API –パート3

    2. MySQLでロック待機タイムアウト超過エラーを修正する方法

    3. PostgreSQLでのVACUUM処理の概要

    4. SQLでトリガー