この記事では、Oracleでテーブルを作成する方法、主キー、外部キー、Oracleでテーブル構文を作成する方法について例を挙げて説明します。これは、OracleDBAとDeveloperの両方にとって非常に役立ちます。彼らは一日に何度もそれで遊んでおり、良い知識は間違いなく彼らが仕事を促進するのを助けることができます。彼らはしばしばデータ型とどのような状況で何を使うべきかについて混乱します。ここでは、Oracleデータベーステーブルに役立つすべてのものの概要を説明しようとしています
Oracleデータベーステーブルとは何ですか?
-テーブルは、Oracleデータベースのデータストレージの基本単位です。データは行と列に保存されます。
-テーブルには、現実の世界で必要なものがすべて含まれています
-テーブルには一連の列が含まれています。列は、テーブル内の1種類のデータを表します。たとえば、EMPテーブルのsalary列にはsalariesが含まれます
- 行は、単一のレコードに対応する列情報のコレクションです。
次に、 Oraclecreatetableステートメントについて詳しく説明します。
Oracleでテーブルを作成する方法
データベースにテーブルを作成するには、次の情報が必要です
- テーブル名
- テーブルタイプ
- 制約
- テーブルストレージパラメータ
これらのそれぞれについて詳しく見ていきましょう
Oracleのテーブル命名規則はテーブルを作成します
- テーブルに選択する名前は、次の標準ルールに従う必要があります。
- 名前は文字A-Zまたはa-zで始まる必要があります
- 数字とアンダースコアを含めることができます
- 小文字の大文字にすることができます
- 最大30文字の長さにすることができます。 12.2では、128文字に拡張されました
- スキーマ内の別の既存のオブジェクトと同じ名前を使用することはできません
- OracleサーバーおよびSQLの予約語であってはなりません
- 列名、列データ型、および列サイズ。
列の命名規則–
- 列に選択する名前は、次の標準ルールに従う必要があります。
- 名前は文字A-Zまたはa-zで始まる必要があります
- 数字とアンダースコアを含めることができます
- 小文字の大文字にすることができます
- 最大30文字の長さにすることができます。12.2では、128文字に拡張されました
- スキーマ内の別の既存のオブジェクトと同じ名前を使用することはできません
- OracleサーバーおよびSQLの予約語であってはなりません
テーブルの種類
通常の(ヒープ編成された)テーブル
-これは、基本的な汎用タイプのテーブルです。
-そのデータは順序付けられていないコレクション(ヒープ)として保存されます
クラスター化されたテーブル
-クラスター化されたテーブルは、クラスターの一部であるテーブルです。
-クラスターは、共通の列を共有し、多くの場合一緒に使用されるため、同じデータブロックを共有するテーブルのグループです。
インデックス編成テーブル
-通常の(ヒープ編成された)テーブルとは異なり、インデックス編成されたテーブルのデータは、主キーでソートされた方法でBツリーインデックス構造に格納されます。
-インデックスで編成されたテーブル行の主キー列の値を格納するだけでなく、Bツリーの各インデックスエントリには非キー列の値も格納されます。
パーティションテーブル
–Oracleパーティションテーブルを使用すると、データをパーティションまたはサブパーティションと呼ばれる、より小さく、より管理しやすい部分に分割できます。
- 各パーティションは個別に管理でき、他のパーティションとは独立して動作できるため、可用性とパフォーマンスをより適切に調整できる構造が提供されます。
外部テーブル
Oracle外部テーブルを使用すると、Oracleは、データベースの外部でフラットファイルに保存されているデータをクエリできます。
グローバル一時テーブル
グローバル一時テーブルのデータはプライベートであるため、セッションによって挿入されたデータには、そのセッションからのみアクセスできます。グローバル一時テーブルのセッション固有の行は、セッション全体、または現在のトランザクションのみで保持できます
制約とルール
テーブルの各列にルールを指定できます。これらのルールは整合性制約と呼ばれます。そのような例の1つは、nullではない整合性制約です。この制約により、列にはすべての行に値が含まれるようになります。これらのルールは、各列または列のセットに適用されます。テーブルがデータアクションに参加するたびに、これらのルールが検証され、違反すると例外が発生します。
制約は次のいずれかになります。
- 列レベルの制約
列レベルの制約は、テーブル内の1つの列を参照し、列名を指定しません(チェック制約を除く)。続く列を参照します。
- テーブルレベルの制約
テーブルレベルの制約は、テーブル内の1つ以上の列を参照します。テーブルレベルの制約は、それらが適用される列の名前を指定します。テーブルレベルのCHECK制約は、テーブル内の0個以上の列を参照できます。
使用可能な制約タイプは、NOT NULL、主キー、一意、チェック、および外部キーです。
主キー
Oracleの主キーは、テーブル内の列であり、その値はテーブル内の行を一意に識別します。主キー値:
a)行を一意に識別する必要があります。
b)NULL値を持つことはできません;
Oracleは、列値の重複を防ぐために、一意のOracleインデックスを内部的に作成します。列またはテーブルレベルで定義できます
主キーは複数の列にすることもできます
一意のキー
Oracleの一意キーは、列の一意性を意味します。 Oracleサーバーは、一意の制約を持つ列に重複する値を許可しません。 Oracleは、列の値の重複を防ぐために、内部で一意の索引を作成します。ただし、一部の値をnullにすることができます。列またはテーブルレベルで定義できます
外部キー
-Oracleの外部キーは、2つのテーブル間の参照制約です。
-外部キー制約は、別のテーブルまたは同じ別の列の別の列の値に対してINSERTまたはUPDATEの値を検証します
-外部キーは常に親子関係を定義します。 「親」は外部キーで参照される列であり、「子」は外部キー制約を含む1つまたは複数の列です。
-ただし、一般的に、外部キーは別のテーブルの主キーを指す1つまたは複数のフィールドです。
-列またはテーブルレベルで定義できます
チェック制約
Oracleチェック制約では、指定された条件に準拠するためにデータベース内の値が必要です。チェック制約を使用すると、列に条件付きルールを適用できます。条件付きルールは、データを列に挿入する前に検証する必要があります。条件には、サブクエリまたは疑似列CURRVAL NEXTVAL、LEVEL、ROWNUM、またはSYSDATEを含めることはできません。
Oracleでは、1つの列に複数のCHECK制約を設定できます。実際、列に定義できるCHECK制約の数に実際的な制限はありません。
列またはテーブルレベルで定義できます
ヌルではない
これは、データ行にNOTNULLとして指定された列の値が必要であることを意味します。 Oracleサーバーは、この制約に違反する行を格納することを許可しません。これは列レベルでのみ定義でき、テーブルレベルでは定義できません。
テーブルストレージパラメータ
テーブルは、データベースのOracleテーブルスペースに格納されます。表スペースが指定されていない場合、表はユーザーのデフォルトの表スペースになります。
簡単に言えば
1)上記の基準に従って適切な列名とテーブル名を選択する必要があります。名前を確認して目的を識別できるように、列名とテーブル名を付けることをお勧めします
2)次に、テーブルに適切なOracleデータ型を選択する必要があります。
文字列の場合は、VARCHAR2(10)を選択する必要があります。これは可変文字列です。値を適切に選択する必要があります。これは、10バイトまでの文字を格納できることを意味します。使用されるスペースは列の値によって異なり、スペースの無駄はありません。
ここで強調したいのは、ここでVARCHAR2(10)を指定すると、10は文字ではなくバイト数です。
ASCII文字が含まれる場合、文字数とバイト数は似ていますが、式が変更されます。 ASCII以外の文字の使用を開始する
現在、VARCHAR2は4000バイトをサポートしています。列がそれよりも大きい場合は、ギガバイトのテキストを格納できるLOBデータ型を使用できます。
数値の場合は、データ型Numberを使用します。ここでも、値を適切に選択できます。例番号(6,2)これには999999.99からの最大値を含めることができます
日付を保存する場合は、Oracleが保存用の日付データ型を提供しています。
3)テーブルの制約を特定します。主キーとなるものと、すべての列がnullにならないものを決定します。
必要な情報がすべて揃ったら、テーブルの作成を進めることができます
Oraclecreatetable構文
CREATE TABLE table_name ( col1 datatype [ NULL | NOT NULL ], col2 datatype [ NULL | NOT NULL ], ... col_n datatype [ NULL | NOT NULL ] ) tablespace <tablepace name>;
SYNTAX for oraclecreateTableの主キー。列レベルまたはテーブルレベルの両方で定義できます
Table level CREATE TABLE table_name ( col1 datatype [ NULL | NOT NULL ], col2 datatype [ NULL | NOT NULL ], ... col_n datatype [ NULL | NOT NULL ] constraint <name> primary key (col1,col2) ) tablespace <tablepace name> Column Level CREATE TABLE table_name ( col1 datatype [ NULL | NOT NULL ] constraint <name> primary key , col2 datatype [ NULL | NOT NULL ], ... col_n datatype [ NULL | NOT NULL ] ) tablespace <tablepace name>
例 oraclecreateTableの主キー
CREATE TABLE SCOTT.TEST ( Created_by date, SOURCE CHAR(10), REQUEST_ID CHAR(64) NOT NULL CONSTRAINT TEST_PK PRIMARY KEY, COMMENTS VARCHAR(3000) ); CREATE TABLE TESTEXP ( INV_ID CHAR(7) NOT NULL, ITEM_ID CHAR(7) NOT NULL, CREATED date, WHO CHAR(7), CONSTRAINT TEST1_PK PRIMARY KEY (INV_ID,ITEM_ID) );
Oracleは、主キーの制約を適用するためのインデックスを作成します
関連:Oracleの面接の質問
テーブルTEST1の説明
1 | 最初の列はと呼ばれます inv_id これはcharデータ型(最大7桁の長さ)として作成され、null値を含めることはできません |
2 | 2番目の列はと呼ばれます item_id これはcharデータ型(最大7桁の長さ)として作成され、null値を含めることはできません |
3 | 3番目の列はcreatedと呼ばれます。これは日付です データ型であり、null値を含めることもできます。 |
4 | 4番目の列はwhoと呼ばれ、charデータ型であり、null値を含めることもできます。 |
5 | テーブルレベルの主キー制約TEST1_PKは、複合キー(INV_ID、ITEM_ID)で定義されています |
SYNTAX for oracle create Table statementFOREIGNKey。列レベルまたはテーブルレベルの両方で定義できます
CREATE TABLE table_name ( col1 datatype [ NULL | NOT NULL ], col2 datatype [ NULL | NOT NULL ], ... col_n datatype [ NULL | NOT NULL ] constraint <name> FOREIGN KEY (col1,col2) REFERENCES table(col1,col2) ) tablespace <tablepace name> CREATE TABLE table_name ( col1 datatype [ NULL | NOT NULL ] constraint <name> primary key , col2 datatype [ NULL | NOT NULL ], ... col_n datatype [ NULL | NOT NULL ] ) tablespace <tablepace name>; CREATE TABLE dept ( dept_id number(10) NOT NULL, dept_name varchar2(50) NOT NULL, CONSTRAINT dept_pk PRIMARY KEY (dept_id) ); CREATE TABLE emp ( emp_no number(10) NOT NULL, emp_name varchar2(50) NOT NULL, dept_id number(10), sal number(6), CONSTRAINT emp_pk PRIMARY KEY (emp_no), CONSTRAINT dept_fk FOREIGN KEY (dept_id) REFERENCES dept(dept_id) );
テーブルEMPの説明
1 | 最初の列はEMP_NOと呼ばれます これは数値として作成され、null値を含めることはできません |
2 | 2番目の列はemp_nameと呼ばれます これはvarchar2(50)として作成され、null値を含めることはできません |
3 | 3番目の列はdept_idと呼ばれます これは数字です。 |
4 | 4番目の列はsalと呼ばれます これは数値データ型であり、null値を含めることもできます。 |
5 | テーブルレベルの主キー制約EMP_PKは、キー(EMP_NO)で定義されます |
6 | deptテーブルdept_idを参照するテーブルレベルの外部キー制約dept_fk |
-スキーマに新しいテーブルを作成するには、テーブルシステムの作成権限が必要です。
- 別のユーザーのスキーマにテーブルを作成するには、テーブルシステムの作成権限が必要です。さらに、テーブルの所有者には、テーブルを含むテーブルスペースのクォータ、またはUNLIMITEDTABLESPACEシステム権限が必要です。
関連:SQLクエリの記述方法
キャッシュ/キャッシュなし
CACHE句を使用して、OracleDatabaseがブロックをバッファ・キャッシュに格納する方法を示します。 create tableコマンドで何も指定しない場合、デフォルトではキャッシュなしです
デフォルト
挿入または更新によって列の値がNULLのままになる場合に、列に挿入される値。
<デフォルト<値>| NULL>
パラレル
参加しているすべてのインスタンスで使用可能なCPUの数にPARALLEL_THREADS_PER_CPU初期化パラメータの値を掛けたものに等しい並列度をOracleに選択させる場合は、PARALLELを指定します。
圧縮
これは、Oracleがテーブルを圧縮形式で格納するために使用します。これは11g以降で利用できます
表または列にコメントを付ける
コマンドを使用してテーブルにコメントできます
COMMENT ON TABLE <table_name> IS '<comment>';
Oracleはデフォルト値でテーブルを作成します
insertステートメントで指定されていない場合にデフォルト値を列に割り当てたい場合は、以下の構文でテーブルを作成できます。 DEFAULTは使用されるキーワードです
CREATE TABLE EXP ( NAME VARCHAR2(20), SAL number(8,2) DEFAULT 800, hire_date DATE DEFAULT SYSDATE , birthdate DATE DEFAULT SYSDATE -10 )
Oracleは12cでテーブルのデフォルト値を変更します
IDENTITY列
Oracle Database 12cでは、American National Standards Institute(ANSI)のSQLキーワードであるSQLキーワードIDENTITYを使用してテーブル列を定義できます。これは挿入時に自動インクリメントされます(MySQLのように)。
Example: create table test ( id number generated as identity, name varchar2(100), email varchar2(100), password varchar2(100), firstname varchar2(100), lastname varchar2(100) );
Sequence as Default Value With Oracle Database 12c, we can directly assign sequence nextval as a default value for a column, So you no longer need to create a trigger to populate the column with the next value of sequence, you just need to declare it with table definition.It is a sort of auto-increment feature for a column in oracle just like 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) );を作成します。
メタデータ-デフォルト値のみ
以前のOracle11gでは、既存のテーブルに新しい列を追加するには、そのテーブルのすべての行を変更して新しい列を追加する必要がありました。したがって、テーブルが非常に大きい場合は、テーブルの追加列の変更にかなりの時間とロック時間がかかりました。
Oracleでは、11gはメタデータのみのデフォルト値の概念を導入しました。 DEFAULT句を含むNOTNULL列を既存のテーブルに追加するには、テーブル内のすべての行を変更するのではなく、メタデータを変更するだけで済みます。新しい列のクエリは、結果がデフォルトの定義と一致することを確認するためにオプティマイザによって書き直されました。
詳細については、以下の記事をご覧ください
テーブル追加列オラクルを変更する方法
Oracle 12cはこれをさらに一歩進め、必須列とオプション列の両方のメタデータのみのデフォルト値を許可します。その結果、DEFAULT句を使用して新しい列を既存のテーブルに追加すると、その列がNOT NULLとして定義されているかどうかに関係なく、メタデータのみの変更として処理されます。
これはすべての人にとって大きなメリットです。
すべてのテーブルおよび列情報は、SYS.TAB$およびSYS.COL$テーブルに保管されます。 Oracleは、テーブルと列に関する情報を取得するためのデータディクショナリビューを提供しています
ビューには3つのカテゴリがあります
Oracleですべてのテーブルを一覧表示する方法
To list all tables owned by the current user, type: select tablespace_name, table_name from user_tables; To list all tables in a database: select tablespace_name, table_name from dba_tables; To list all tables accessible to the current user, type: select tablespace_name, table_name from all_tables To describe the table in SQLPLUS desc <table_name>でテーブルを記述します
select owner as "Schema" , segment_name as "Object Name" , segment_type as "Object Type" , round(bytes/1024/1024,2) as "Object Size (Mb)" , tablespace_name as "Tablespace" from dba_segments where segment_name=’<table_name>’;
行数とコメント数のあるテーブル
以下のクエリを使用して、SCOTTスキーマの行数とコメント数を見つけることができます
select tab.owner as schema_name,
tab.table_name as table_name,
obj.created,
obj.last_ddl_time as last_modified,
tab.num_rows,
tab.last_analyzed,
comm.comments
from all_tables tab
inner join all_objects obj
on obj.owner = tab.owner
and obj.object_name = tab.table_name
left outer join all_tab_comments comm
on tab.table_name = comm.table_name
and tab.owner = comm.owner
where tab.owner = 'SCOTT'
order by tab.owner,
tab.table_name;
Oracle作成テーブルに関するよくある質問
1. oracleには、テーブルoracleコマンドの作成または置換がありますか?
Oracleには、テーブルoracleコマンドの作成または置換はありません。作成または置換は、ビュー、PLSQL:プロシージャに対してのみ有効です。 ALTER Tableコマンドのみを使用して変更を行う必要があります
または、テーブルを明示的に削除して再作成することもできます
直接的なものはありませんが、PLSQLを使用して
SET SERVEROUTPUT ON
DECLARE c_emp int:=0;をエミュレートできます。
BEGIN SELECT count(*)into c_emp FROM dba_tables where table_name ='EMP';
if c_emp <=0
EXECUTE IMMEDIATE'create table EMP(ID NUMBER(3)、NAME VARCHAR2( 30)NOT NULL、SAL NUMBER *、2))';
end if;
END;
/
実践するサンプルスキーマ
SQL>CREATE TABLE "DEPT" ( "DEPTNO" NUMBER(2,0), "DNAME" VARCHAR2(14), "LOC" VARCHAR2(13), CONSTRAINT "PK_DEPT" PRIMARY KEY ("DEPTNO") ) SQL>CREATE TABLE "EMP" ( "EMPNO" NUMBER(4,0), "ENAME" VARCHAR2(10), "JOB" VARCHAR2(9), "MGR" NUMBER(4,0), "HIREDATE" DATE, "SAL" NUMBER(7,2), "COMM" NUMBER(7,2), "DEPTNO" NUMBER(2,0), CONSTRAINT "PK_EMP" PRIMARY KEY ("EMPNO"), CONSTRAINT "FK_DEPTNO" FOREIGN KEY ("DEPTNO") REFERENCES "DEPT" ("DEPTNO") ENABLE ); SQL> desc emp Name Null? Type ----------------------------------------- -------- ----------------------- EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NUMBER(2) SQL> SQL> desc dept Name Null? Type ----------------------------------------- -------- ----------------------- DEPTNO NOT NULL NUMBER(2) DNAME VARCHAR2(14) LOC VARCHAR2(13) SQL> insert into DEPT values(10, 'ACCOUNTING', 'NEW YORK'); insert into dept values(20, 'RESEARCH', 'DALLAS'); insert into dept values(30, 'RESEARCH', 'DELHI'); insert into dept values(40, 'RESEARCH', 'MUMBAI'); insert into emp values( 7698, 'Blake', 'MANAGER', 7839, to_date('1-5-2007','dd-mm-yyyy'), 2850, null, 10 ); insert into emp values( 7782, 'Clark', 'MANAGER', 7839, to_date('9-6-2008','dd-mm-yyyy'), 2450, null, 10 ); insert into emp values( 7788, 'Scott', 'ANALYST', 7566, to_date('9-6-2012','dd-mm-yyyy'), 3000, null, 20 ); insert into emp values( 7789, 'TPM', 'ANALYST', 7566, to_date('9-6-2017','dd-mm-yyyy'), 3000, null, null ); insert into emp values( 7560, 'T1OM', 'ANALYST', 7567, to_date('9-7-2017','dd-mm-yyyy'), 4000, null, 20 ); insert into emp values( 7790, 'TOM', 'ANALYST', 7567, to_date('9-7-2017','dd-mm-yyyy'), 4000, null, null ); SQL> select * from emp; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- --------- ---------- ---------- ---------- 7698 BLAKE MANAGER 7839 01-MAY-07 2850 10 7782 CLARK MANAGER 7839 09-JUN-08 2450 10 7788 SCOTT ANALYST 7566 09-JUN-12 3000 20 7789 TPM ANALYST 7566 09-JUN-17 3000 7790 TOM ANALYST 7567 09-JUL-17 4000 7560 T1OM ANALYST 7567 09-JUL-17 4000 20 After the practice is over, you can drop the tables SQL>drop table emp; SQL>drop table dept;を削除できます。
oracle create tableステートメント、コマンド、構文、およびヒントに関するこの記事が気に入っていただければ幸いです。
関連記事
alter table add column oracle:table addcolumnoracleを変更する方法に関する有用な洞察。 oracle11gで導入された高速追加列機能の詳細も提供されています
DROPTABLE ORACLE:Oracleのドロップテーブル、Oracleに存在する場合はドロップテーブル、1つのコマンドで複数のテーブルをドロップ、テーブルカスケード制約をドロップ
alter table move:alter table moveを使用してOracleでテーブルを再構築する方法、LOBを持つテーブルを再構築する方法、長い列のステップバイステップの方法については、この投稿を確認してください。
Truncate TABLE Oracle:OracleでのTruncate TABLEは、より高速です。 oracleのテーブルから削除します。これはDDLステートメントであり、削除トリガーでは発生しません。
Oracleのテーブルの変更:Oracleのテーブルの変更は、列の変更、制約の削除と追加、テーブル列のデータタイプの変更、テーブルの変更に使用されます。ストレージパラメータ
oracleはすべてのテーブルを一覧表示します。all_tablesまたはuser_tablesまたはdba_tablesをクエリすることにより、Oracleのすべてのテーブルを一覧表示できます。必要に応じて列とwhere句を選択できます
Oracleの補足ログ
oraclesql日付関数
https://docs.oracle.com/cd/B19306_01/server.102/ b14231 / Tables.htm
Oracleでのグローバル一時テーブルの作成