web-dev-qa-db-fra.com

Question sur la clé primaire/clé composite Oracle

J'ai une clé primaire composée dans 1 table dans Oracle. Je veux créer une clé étrangère pour une entrée de table dans ma deuxième table qui fait référence à la clé primaire composite dans la première table. Je reçois le message d'erreur ORA-02256. Des idées sur la façon dont je peux entrer ceci?

CREATE TABLE groupspersonx ( 
  personid number, 
  groupid number, 
  CONSTRAINT pk_persongroupid PRIMARY KEY(personid, groupid) 
); 

CREATE TABLE restrictedgroups ( 
  groupid number, 
  name varchar2(50), 
  dateadded date, 
  since date, 
  notes varchar2(1024), 
  CONSTRAINT pk_groupid PRIMARY KEY(groupid), 
  CONSTRAINT fk_persongroup FOREIGN KEY(groupid) REFERENCES groupspersonx(personid, groupid) 
); 
12
Christopher

L'erreur est due au fait que FOREIGN KEY est une colonne, mais vous essayez de fournir deux colonnes en tant que parent. Il n'est pas nécessaire de lier la clé composite, car la restrictedgroups n'a pas de colonne personid ...

Vous avez également la relation à l'envers - utilisez:

CREATE TABLE restrictedgroups ( 
  groupid number, 
  name varchar2(50), 
  dateadded date, 
  since date, 
  notes varchar2(1024), 
  CONSTRAINT pk_groupid PRIMARY KEY(groupid)
);

CREATE TABLE groupspersonx ( 
  personid number, 
  groupid number, 
  CONSTRAINT pk_persongroupid PRIMARY KEY(personid, groupid),
  CONSTRAINT fk_persongroup FOREIGN KEY(groupid) REFERENCES restrictedgroups(groupid) 
); 

J'ajouterais une contrainte de clé étrangère pour la table de la variable personid.

19
OMG Ponies
CREATE TABLE groupspersonx( 
  personid number, groupid number, 
CONSTRAINT pk_persongroupid PRIMARY KEY(personid, groupid));

CREATE TABLE restrictedgroups ( 
  pid number, 
  groupid number,
  name varchar2(50), 
  dateadded date, 
  since date, 
  notes varchar2(1024), 
  CONSTRAINT pk_groupid PRIMARY KEY(groupid), 
  CONSTRAINT fk_persongroup FOREIGN KEY(pid,groupid) REFERENCES groupspersonx(personid, groupid));

* le nombre de colonnes de référence est égal à avec les colonnes de clé étrangère

4
user2178442

Chaque fois que vous souhaitez créer une clé primaire composite ou une contrainte unique sur une colonne, vous ne pouvez pas donner de référence dans une autre table.

par ex.

sql>create table t1( a number,b number,c number ,primary key(a,b,c));

table created.

sql>create table g1(a number constraint con_fg references t1(a));

ERROR at line 1:
ORA-02270: no matching unique or primary key for this column-list

Ici t1 est la table parente et g1 est la table enfant. La table enfant peut contenir des valeurs en double dans une colonne. Donc, Oracle n'autorisera pas cette table de colonne.

Voir également

SQL>select constraint_name,constraint_type from user_constraints where table_name='T1';

CONSTRAINT_NAME                C
------------------------------ -
SYS_C005822                    P

Donc, ici aussi, la seule contrainte pour les trois colonnes, à savoir a, b, c dans la table t1.

C'est pourquoi vous ne pouvez pas créer de clé étrangère composite sur ou de contrainte unique composite.

1
harikrish

Vous ne pouvez pas utiliser:

CONSTRAINT fk_persongroup FOREIGN KEY(groupid) REFERENCES groupspersonx(personid, groupid)

Changer cela aussi:

CONSTRAINT fk_persongroup FOREIGN KEY(groupid) REFERENCES groupspersonx(groupid) 

Cela devrait fonctionner.

0
Jay