私たち を使用してテーブルの列のデータ型を変更できます 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