De claves foraneas en postgresql

2002-08-19 Por tema 31
Intento hacer una tabla con dos columnas de clave primaria que a su vez 
son claves foraneas, y me contesta esto


psql:plantas.sql:28: ERROR:  number of key attributes in referenced 
table must be equal to foreign key

   Illegal FOREIGN KEY definition references clons

y no consigo entender porque me da este error, os pego el archivo de 
creación de las tablas a ver si alguien ve alguna forma de solucionarlo


create table nais (
   nome varchar(15) primary key,
   procedencia varchar(30),
   precio money,
   dxerminación date,
   tipo varchar(40)
);
create table clons (
   nome varchar(15) references nais,
   dclon date,
   dtrasplante date,
   dcolleita date,
   comentarios varchar(40),
   primary key(nome, dclon)
);
create table podas (
   nome varchar(15) references clons,
   dclon date references clons,
   dpoda date
);





Re: De claves foraneas en postgresql

2002-08-19 Por tema Antonio Castro
On Mon, 19 Aug 2002, 31 wrote:

 Intento hacer una tabla con dos columnas de clave primaria que a su vez 
 son claves foraneas, y me contesta esto
 
 psql:plantas.sql:28: ERROR:  number of key attributes in referenced 
 table must be equal to foreign key
 Illegal FOREIGN KEY definition references clons
 
 y no consigo entender porque me da este error, os pego el archivo de 
 creación de las tablas a ver si alguien ve alguna forma de solucionarlo
 
 create table nais (
 nome varchar(15) primary key,
 procedencia varchar(30),
 precio money,
 dxerminación date,
 tipo varchar(40)
 );
 create table clons (
 nome varchar(15) references nais,
 dclon date,
 dtrasplante date,
 dcolleita date,
 comentarios varchar(40),
 primary key(nome, dclon)
 );
 create table podas (
 nome varchar(15) references clons,
 dclon date references clons,
 dpoda date
 );

A mi me parece que intentas definir una clave foranea nome varchar(15),
sobre una clave primaria (varchar(15), date).

Supongo que lo  más sencillo sería usar claves primarias de tipo SERIAL.
Equivale a usar secuencias. De esa manera obtienes una clave numérica
facilmente referenciable desde otras tablas mediante un int4.

Si además de esto deseas evitar duplicidados puedes usar
create unique index (nome, dclon)

Bueno todo esto son ideas que deberían ayudarte. Una solución sería
la siguiente aunque puede haber otras formas de hacerlo a mi me gusta
relacionar claves de tablas distintas mediante simples claves numéricas
(Solo 4 bytes).

 
 create table nais (
 nais_key   SERIAL,
 nome varchar(15),
 procedencia varchar(30),
 precio money,
 dxerminación date,
 tipo varchar(40),
 unique index (nome),
 primary key (nais_key)
 );
 create table clons (
 clon_key   SERIAL,
 nais   int4 references nais,
 dclon date,
 dtrasplante date,
 dcolleita date,
 comentarios varchar(40),
 unique index (nais, dclon),
 primary key (clon_key)
 );
 create table podas (
 podas_key  SERIAL,
 clons int4 references clons,
 dpoda date,
 unique index (nome),
 primary key (podas_key)
 );



Un saludo

Antonio Castro

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
/\ /\  Ciberdroide Informática (Tienda de Linux)
  \\W// http://www.ciberdroide.com 
 _|0 0|_
+-oOOO--(___o___)--OOOo+ 
|  . . . . U U . . . . Antonio Castro Snurmacher  [EMAIL PROTECTED]  |  
|  . . . . . . . . . . | 
+()()()--()()()+
| *** 1.700 sitios clasificados por temas sobre Linux en ***Donde_Linux*** |
|  http://www.ciberdroide.com/misc/donde/dondelinux.html |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+