2016-02-24 2 views
-1

Nouveau à Oracle Im essayant d'attribuer une clé compositeidentifiant oracle trop long

CREATE TABLE rep_contracts 
(Store_id NUMBER(8), 
    Name NUMBER(5) 
    Quarter CHAR(3), 
    Rep_id NUMBER(5), 
    CONSTRAINT rep_contracts_rep_idstore_id_pk PRIMARY KEY (rep_id, store_id), 
    CONSTRAINT rep_contracts_rep_id_fk FOREIGN KEY (rep_id), 
    CONSTRAINT rep_contracts_store_id_fk FOREIGN KEY (store_id)); 

et im recevant

ORA-00972: identifier is too long 

Im conscient que l'identificateur de clé Composit plus de 30 ombles mais si je coupe identifiant quelques caractères plus courts ex:

rep_contrac_rep_idstore_id_pk 

e Je reçois en

ORA-00905: missing keyword 

Je ne pouvais trouver aucune solution

+3

Vous avez omis la clause REFERENCES des deux clés étrangères. –

+4

Er donc l'erreur dans la question n'est pas l'erreur - vous avez résolu cela, il n'a rien à voir avec la longueur, le problème est * mot clé manquant * –

+2

@Alex oui mais ayant le mot clé trop long "résout" le problème de mot clé manquant ! ;-) –

Répondre

1

Je nettoyais le script et les commentaires: incorporé

  • ajouté une virgule après le numéro (5)
  • changé tous les noms en majuscules pour enregistrer la douleur plus tard
  • a changé NAME qui est une clé réservée Oracle fonctionne à S_NAME
  • a changé le type de données de CHAR à VARCHAR2
  • ajouté les références de mots clés pour pointer vers la table où la clé étrangère est
  • rebaptisés la contrainte de sorte qu'il ne soit pas plus de 30 caractères

comme ceci:

CREATE TABLE rep_contracts 
    (STORE_ID NUMBER(8), 
    S_NAME NUMBER(5), 
    QUARTER VARCHAR2(3), 
    REP_ID NUMBER(5), 
    CONSTRAINT rep_cont_rep_idstore_id_pk PRIMARY KEY (REP_ID, STORE_ID), 
    CONSTRAINT rep_contracts_rep_id_fk FOREIGN KEY REFERENCES your_table(REP_ID), 
    CONSTRAINT rep_contracts_store_id_fk FOREIGN KEY REFERENCES your_table(STORE_ID)); 
+2

'a changé tous les noms en majuscules pour sauver la douleur plus tard' - ceci est un changement non pertinent. Cela n'a d'importance que si vous utilisez des identifiants sensibles à la casse (c'est-à-dire inclus entre guillemets), ce qui devrait être l'exception lors de la création de tables! – Boneist

+0

@Boneist Non pertinent si vous connaissez les identifiants sensibles à la casse. Pour quelqu'un de nouveau chez Oracle uppercasing est une bonne habitude. – kevinsky