[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: De claves foraneas en postgresql



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  acastro@ciberdroide.com  |  
|  . . . . . . . . . .                                                     | 
+()()()----------()()()----------------------------------------------------+
| *** 1.700 sitios clasificados por temas sobre Linux en ***Donde_Linux*** |
| <<< http://www.ciberdroide.com/misc/donde/dondelinux.html >>>            |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+




Reply to: