2011-07-06 14 views
11

Tengo una clave primaria compuesta en 1 tabla en Oracle. Quiero crear una clave externa para una entrada de tabla en mi segunda tabla que haga referencia a la clave primaria compuesta en la primera tabla. Recibo el error ORA-02256. ¿Alguna idea sobre cómo puedo ingresar a esto?Pregunta principal compuesta/clave externa Oracle pregunta

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) 
); 
+0

crear groupspersonx mesa ( \t personid \t \t número, \t groupid \t \t \t número, \t CONSTRAINT pk_persongroupid PRIMARY KEY (personid, groupid) ); crear restrictedgroups mesa ( \t groupid número \t \t \t, \t nombre \t \t \t VARCHAR2 (50), \t dateadded \t \t fecha, \t desde \t \t \t fecha, \t notas \t \t \t varchar2 (1024) , \t CONSTRAINT pk_groupid PRIMARY KEY (groupid), CONSTRAINT fk_persongroup FOREIGN KEY (groupid) REFERENCIAS groupspersonx (personid, groupid) ); – Christopher

Respuesta

18

El error se debe a que FOREIGN KEY es una columna, pero está intentando proporcionar dos columnas como principal. No hay necesidad de atar a la clave compuesta, debido a que el restrictedgroups no tiene una columna personid ...

Usted también tiene la relación hacia atrás - uso:

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) 
); 

Yo añadiría una restricción de clave externa para cualquier tabla de la que provenga el personid.

+0

Ahora veo, ¡muchas gracias! – Christopher

0

No se puede utilizar:

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

Cambio eso también:

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

que debería funcionar.

1

Siempre que desee crear una clave primaria compuesta o una restricción única en una columna, no puede dar una referencia en otra tabla.

por ej.

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 

Aquí t1 es la tabla principal y g1 es la tabla secundaria. La tabla secundaria puede contener valores duplicados en una columna. Entonces Oracle no permitirá esa tabla de columna.

Ver también

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

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

lo tanto, aquí también la única limitación para las tres columnas es decir a, b, c en la tabla T1.

Es por eso que no se puede crear una extranjera en clave primaria compuesta o restricción única compuesta

4
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)); 

* número de referencias columnas es igual con las columnas de clave externa