create table ROOM
(NO_ROOM INT PRIMARY KEY, TYPE VARCHAR2(8) NOT NULL, SIZE VARCHAR2(8) NOT NULL)
;
ORA-00904 が表示されます。問題は NO_ROOM にあると思います。NUMBER を使用しようとしましたが、同じです。
PS。部屋のタイプと広さが無い部屋用のテーブルを作ります。
SIZE
は予約済みキーワードです。つまり、これを識別子として使用することはできません (二重引用符で囲まない限り、ただし、二重引用符で囲まれた識別子は最悪なので、使用しないでください)。列名を に変更するROOMSIZE
と、ステートメントが実行されます。
TYPE
これもキーワードですが、予約されていないことに注意してください。したがって、列識別子として使用できます。タイプは 8 まで導入されませんでした。予約済みのキーワードを作成TYPE
すると、世界中の Oracle アプリケーションのコードが破損し、特に独自のデータ ディクショナリでコードが破損します。
ドキュメントには、予約語の完全なリストがあります。 ここで見つけてください。
なぜ使用する"SIZE"
のがそんなに悪い考えなのでしょうか? 結局のところ、@JavaBeginner が言うように、SQL 標準ではそれが許可されています。
オラクルの命名規則を回避するために二重引用符を使用することを選択すると、列を参照するたびにそれらを使用することを余儀なくされます。したがって、これは有効なクエリではありません。
select no_room, size
from room
where size > 10
代わりに次のように書く必要があります。
select no_room, "SIZE"
from room
where "SIZE" > 10
そして、それは常にある必要があります"SIZE"
:"size"
は別の識別子です。そうです"Size"
。
ベスト プラクティスとは、標準で許可されていることを十分な情報に基づいて解釈することです。SQL を使用すると、堅牢で保守可能なデータベースを構築したい場合にすべきでないことを実行できます。二重引用符で囲まれた識別子を使用しないことは、そのカテゴリに分類されます。
サイズはキーワードであり、二重引用符を使用しない限り、列名として使用できません。私の提案は、列に別の名前を room_size として使用することです。何らかの理由で SIZE を列名として使用したい場合は、テーブルを作成するときに二重引用符を使用する必要があり、この列を使用して他のクエリを実行するときにも同じように注意する必要があります。
列名として使用されるサイズの作業フィドルは次のとおりですhttp://sqlfiddle.com/#!4/7e746
列名に予約語を使用する(二重引用符を使用する)ことは悪い考えであることを追加したいと思います(上記と同じ)。
次の予約語は識別子として使用できません: http://docs.oracle.com/cd/B19306_01/server.102/b14200/ap_keywd.htm
サイズは一覧にございます。列に別の名前を選択しても問題ありません。
SIZE
は Oracle の予約語です。したがって、それらを変数またはオブジェクトの名前として使用することは許可されていません。ここでhttp://docs.oracle.com/cd/B28359_01/appdev.111/b31231/appb.htm Oracle 11g の予約語のリストを 見つけることができます。
"SIZE"
これが2番目の瞬間です。またはのように二重引用符内で使用できますが"Size"
、大文字と小文字が区別されるため、お勧めしません.