Je regarde ce code depuis deux jours et je n'arrive pas à le faire fonctionner. Il continue à me donner ORA-00907: missing right parenthesis
. Je sais que c'est un sujet qui revient souvent, mais pour une raison quelconque, aucun des exemples que j'ai vus ne m'a aidé. Quelqu'un peut-il me dire, s'il vous plaît, pourquoi j'ai eu cette erreur et comment puis-je la réparer? Je suis à peu près sûr que cela n'a rien à voir avec ma parenthèse, c'est peut-être mon 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);
Voici les résultats obtenus lorsque je lance le code:
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.
Voici une liste complète des erreurs:
CONSTRAINT fk_order_id_orders FOREIGN KEY (order_id) REFERENCES orders (order_id) ON DELETE CASCADE
HISTORYS_T
avant d'avoir créé la table référencée ORDERS
.HISTORYS_T
.LIBRARY_T and FORMAT_T
). DATE DEFAULT sysdate.
Ce sont toutes des erreurs de syntaxe. Vous auriez perdu beaucoup moins de deux jours si vous aviez bien examiné la documentation d'Oracle. Trouvez-le ici .
En plus des erreurs, vos scripts contiennent des erreurs.
LIBRARY_T
et FORMATS
. Vous pouvez le faire en créant les contraintes dans une instruction distincte, mais ce n’est pas le cas: vous aurez des problèmes lors de l’insertion de lignes et des problèmes encore plus graves de suppression. Vous devez reconsidérer votre modèle de données et trouver un moyen de modéliser la relation entre les deux tables afin que l’une soit le parent et l’autre l’enfant. Ou peut-être avez-vous besoin d'un type de relation différent, tel qu'une table d'intersection.LIBRARY_T
est laide. Essayez de trouver un nom plus expressif qui ne nécessite pas de suffixe inutile pour éviter un conflit de mots-clés.T_CUSTOMERS
est encore plus laid, étant à la fois incohérent avec vos autres tables et totalement inutile, car customers
n'est pas un mot clé.Je recommanderais de séparer toutes les contraintes de clé étrangère de vos instructions CREATE TABLE
. Créez d'abord toutes les tables sans contraintes FK, puis créez toutes les contraintes FK une fois que vous avez créé les tables.
Vous pouvez ajouter une contrainte FK à une table à l'aide de SQL, comme suit:
ALTER TABLE orders ADD CONSTRAINT orders_FK
FOREIGN KEY (m_p_unique_id) REFERENCES library (m_p_unique_id);
En particulier, vos tables formats
et library
ont toutes deux des contraintes de clé étrangère. Les deux instructions CREATE TABLE
permettant de créer ces deux tables ne peuvent jamais s'exécuter correctement, car chacune ne fonctionnera que si l'autre table a déjà été créée.
Séparer la création de contraintes vous permet de créer des tables avec des contraintes FK les unes sur les autres. De plus, si vous rencontrez une erreur avec une contrainte, seule la création de cette contrainte est impossible. À l'heure actuelle, en raison d'erreurs dans les contraintes de vos instructions CREATE TABLE
, la création de tables entières échoue et vous obtenez différentes erreurs en retour, car les contraintes FK peuvent dépendre de la création de ces tables.
En premier lieu, dans histories_T, vous référencez la table T_customer (il devrait s'agir de T_customers), puis, il vous manque la clause FOREIGN KEY que REFERENCES commande; qui n'est pas créé (ou supprimé) avec le code que vous avez fourni.
Il peut également y avoir des erreurs supplémentaires, et j’admets que Oracle n’a jamais été aussi doué pour décrire la cause de ces erreurs - «Mutating Tables» est un exemple typique.
Faites-moi savoir s'il vous manque des problèmes supplémentaires.
Bien qu’à partir de _T
inutile et d’histoires mal orthographiées. Si vous utilisez SQL*Plus
, il n'accepte pas les instructions create table avec de nouvelles lignes vides entre create table <name> (
et les définitions de colonne.