私は過去2日間このコードを見てきましたが、動作するように思えません。 ORA-00907: missing right parenthesis
。これは非常に多く取り上げられるトピックであることは知っていますが、何らかの理由で、私が見た例はどれも私を助けてくれませんでした。このエラーが発生した理由と修正方法を教えてください。おそらく私のCONSTRAINTS
とは関係ありません。
DROP TABLE T_customers CASCADE CONSTRAINTS;
DROP TABLE dvd_collection CASCADE CONSTRAINTS;
DROP TABLE vhs_collection CASCADE CONSTRAINTS;
CREATE TABLE T_customers (
customer_id VARCHAR2 (8) PRIMARY KEY,
last_name VARCHAR2 (30) NOT NULL,
first_name VARCHAR2 (20) NOT NULL,
street VARCHAR2 (30) NOT NULL,
city VARCHAR2 (30) NOT NULL,
state CHAR (2) NOT NULL,
CHECK (state IN ('GA','DC','VA','NY')),
Zip_code CHAR (5)
CHECK (TO_NUMBER(Zip_code)
BETWEEN 10000 AND 27999),
home_phone VARCHAR2 (12) UNIQUE,
work_phone VARCHAR2 (12) UNIQUE,
email VARCHAR2 (95) NOT NULL);
CREATE TABLE historys_T (
history_record VARCHAR2 (8),
customer_id VARCHAR2 (8),
CONSTRAINT historys_T_FK FOREIGN KEY (customer_id) REFERENCES T_customer
ON DELETE CASCADE,
order_id VARCHAR2 (10) NOT NULL,
CONSTRAINT fk_order_id_orders
REFERENCES orders
ON DELETE CASCADE);
CREATE TABLE orders (
order_id VARCHAR2 (10) PRIMARY KEY,
m_p_unique_id VARCHAR2 (10),
CONSTRAINT orders_FK FOREIGN KEY (m_p_unique_id) REFERENCES library (m_p_unique_id)
order_date DATE DEFAULT);
CREATE TABLE library_T (
m_p_unique_id VARCHAR2 (10) PRIMARY KEY,
movie_title VARCHAR2 (80) NOT NULL,
serial_number VARCHAR2 (10) NOT NULL,
movie_id_number VARCHAR2 (10) NOT NULL,
movie_cast VARCHAR2 (100) NOT NULL,
movie_format CHAR (3) NOT NULL,
CONSTRAINT library_FK REFERENCES formats (movie_format));
CREATE TABLE formats_T (
movie_format CHAR (3) PRIMARY KEY,
movie_title VARCHAR2 (80) NOT NULL,
m_p_unique_id VARCHAR2 (10) NOT NULL,
CONSTRAINT format_FK REFERENCES library (m_p_unique_id));
CREATE TABLE dvd_collection (
m_p_unique_id VARCHAR2 (10) NOT NULL,
serial_number VARCHAR2 (10) NOT NULL,
movie_id_number VARCHAR2 (10) NOT NULL,
movie_title VARCHAR2 (80) NOT NULL,
movie_cast VARCHAR2 (100) NOT NULL,
movie_format VARCHAR2 (80) NOT NULL,
movie_rating VARCHAR2 (6) NOT NULL,
movie_distributer VARCHAR2 (30) NOT NULL,
movie_price NUMBER (3,2) NOT NULL,
movie_length NUMBER (3) NOT NULL,
movie_award VARCHAR2 (175) NOT NULL,
movie_release DATE);
CREATE TABLE vhs_collection
(
m_p_unique_id VARCHAR2 (10)NOT NULL,
serial_number VARCHAR2 (10) NOT NULL,
movie_id_number VARCHAR2 (10) NOT NULL,
movie_title VARCHAR2 (80) NOT NULL,
movie_cast VARCHAR2 (100) NOT NULL,
movie_format VARCHAR2 (80) NOT NULL,
movie_rating VARCHAR2 (6) NOT NULL,
movie_distributer VARCHAR2 (30) NOT NULL,
movie_price NUMBER (3,2) NOT NULL,
movie_length NUMBER (3) NOT NULL,
movie_award VARCHAR2 (175) NOT NULL,
movie_release DATE);
コードを実行すると、次の結果が得られます。
Table dropped.
Table dropped.
Table dropped.
Table created.
ON DELETE CASCADE)
*
ERROR at line 10:
ORA-00907: missing right parenthesis
order_date DATE DEFAULT)
*
ERROR at line 6:
ORA-00907: missing right parenthesis
CONSTRAINT library_FK REFERENCES formats (movie_format))
*
ERROR at line 9:
ORA-00907: missing right parenthesis
CONSTRAINT format_FK REFERENCES library (m_p_unique_id))
*
ERROR at line 6:
ORA-00907: missing right parenthesis
Table created.
Table created.
ORA-00907:右括弧がありません
これは、コードに1つ以上の構文エラーが含まれていることを示すいくつかの一般的なエラーメッセージの1つです。場合によっては、文字通り右角かっこを省略したことを意味する場合があります。これは、match bracket機能を備えたエディターを使用しているかどうかを確認するのに十分簡単です(ほとんどのテキストエディターはコーダー向けです)。しかし、多くの場合、コンパイラはコンテキストから外れたキーワードに遭遇したことを意味します。または、スペルミスのWord、アンダースコアの代わりのスペース、またはコンマの欠落です。
残念ながら、アウトコードがコンパイルされない理由として考えられるものは事実上無限であり、コンパイラーはそれらを区別するのに十分ではありません。そのため、ORA-00907: missing right parenthesis
のような一般的でやや不可解なメッセージを投げかけ、実際のブルーマーを見つけるためにそれを残します。
投稿されたスクリプトには、いくつかの構文エラーがあります。まず、そのORA-0097をトリガーするエラーについて説明しますが、すべてを修正する必要があります。
外部キー制約は、参照列に沿って、またはすべての列が宣言された後にテーブルレベルで宣言できます。これらには異なる構文があります。スクリプトでこの2つを混ぜると、ORA-00907が取得されます。
行内宣言にはコンマがなく、参照列名は含まれません。
CREATE TABLE historys_T (
history_record VARCHAR2 (8),
customer_id VARCHAR2 (8)
CONSTRAINT historys_T_FK FOREIGN KEY REFERENCES T_customers ON DELETE CASCADE,
order_id VARCHAR2 (10) NOT NULL,
CONSTRAINT fk_order_id_orders REFERENCES orders ON DELETE CASCADE)
テーブルレベルの制約は個別のコンポーネントであるため、カンマがあり、参照列に言及しています。
CREATE TABLE historys_T (
history_record VARCHAR2 (8),
customer_id VARCHAR2 (8),
order_id VARCHAR2 (10) NOT NULL,
CONSTRAINT historys_T_FK FOREIGN KEY (customer_id) REFERENCES T_customers ON DELETE CASCADE,
CONSTRAINT fk_order_id_orders FOREIGN KEY (order_id) REFERENCES orders ON DELETE CASCADE)
他の構文エラーのリストは次のとおりです。
ORDERS
テーブルを作成する前にHISTORYS_T
の外部キーを作成することはできません。LIBRARY_T
およびFORMAT_T
)で参照されているテーブルの名前のスペルを間違えました。DATE DEFAULT sysdate
。自分のコードをクールな目で見ることは、開発者として成功するために必要なスキルです。オラクルのドキュメントに精通していると本当に助かります。コードとSQLリファレンスの例を並べて比較することで、これらの構文エラーを2日以内に解決できました。 ここで見つける(11g) および ここで(12c) .
構文エラーに加えて、スクリプトには設計ミスが含まれています。これらは失敗ではなく、習慣になるべきではない悪い習慣です。
HISTORY_T
にはhistorys_T_FK
およびfk_order_id_orders
という制約がありますが、どちらも役に立ちません。便利な規則は<child_table>_<parent_table>_fk
です。 history_customer_fk
とhistory_order_fk
です。LIBRARY_T
とFORMATS
の間に循環外部キーを作成しようとしています。別のステートメントで制約を作成することでこれを行うことができますが、しないでください。行を挿入するときに問題が発生し、削除に関するさらに悪い問題が発生します。データモデルを再検討し、2つのテーブル間の関係をモデル化して、一方が親、他方が子になるようにする方法を見つける必要があります。または、交差テーブルなど、別の種類の関係が必要な場合があります。LIBRARY_T
の命名規則はいです。キーワードの衝突を避けるために不必要なサフィックスを必要としない、より表現力豊かな名前を見つけてください。T_CUSTOMERS
はさらにく、customers
はキーワードではないため、他のテーブルと一貫性がなく、完全に不要です。ものに名前を付けるのは難しいです。あなたは私が長年にわたってテーブル名について持っていた悩みを信じないでしょう。最も重要なことは一貫性です。データディクショナリを見て、T_CUSTOMERS
およびLIBRARY_T
というテーブルが表示された場合、最初の応答は混乱しています。これらのテーブルの名前が異なるのはなぜですか?これはどのような概念的な違いを表していますか?それで、命名規則を決め、それに固執してください。テーブル名をすべて単数形またはすべて複数形にします。接頭辞と接尾辞をできるだけ避けます。テーブルであることは既にわかっているので、T_
や_TAB
は必要ありません。
すべての外部キー制約をCREATE TABLE
ステートメントから分離することをお勧めします。最初にすべてのテーブルをFK制約なしで作成し、テーブルを作成したらすべてのFK制約を作成します。
次のようなSQLを使用して、FK制約をテーブルに追加できます。
ALTER TABLE orders ADD CONSTRAINT orders_FK
FOREIGN KEY (m_p_unique_id) REFERENCES library (m_p_unique_id);
特に、formats
テーブルとlibrary
テーブルの両方には、相互に外部キー制約があります。これら2つのテーブルを作成する2つのCREATE TABLE
ステートメントは、他のテーブルが既に作成されている場合にのみ機能するため、正常に実行できません。
制約の作成を分離すると、FK制約が相互に関係するテーブルを作成できます。また、制約にエラーがある場合、その制約のみの作成に失敗します。現時点では、CREATE TABLE
ステートメントの制約にエラーがあるため、テーブル全体の作成は失敗し、FK制約は作成に失敗したこれらのテーブルに依存する可能性があるため、さまざまなノックオンエラーが発生します。
まず、histories_Tでは、テーブルT_customer(T_customersである必要があります)を参照しています。次に、REFERENCESが順序付けするFOREIGN KEY句がありません。指定したコードでは作成(または削除)されていません。
同様に追加のエラーが発生する可能性がありますが、Oracleがエラーの原因を説明するのに苦労したことはありません。「テーブルの変更」がその典型です。
不足している追加の問題がある場合はお知らせください。
役に立たない_T
と間違ったスペルの履歴からではありますが。 SQL*Plus
を使用している場合、create table <name> (
と列定義の間に空の改行があるcreate tableステートメントは受け入れません。