Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » PostgreSQL »

ayuda urgente: Introducir los valores de las FK

Estas en el tema de ayuda urgente: Introducir los valores de las FK en el foro de PostgreSQL en Foros del Web. Tengo las siguientes tablas : CLIENTE Codigo_cliente Integer NOT NULL Default nextval ('codigo_cliente_seq'), Id_telefono_fijo Integer Default nextval ('Id_telefono_fijo_seq'), DNI Char(9) NOT NULL, Nombre Text NOT ...
  #1 (permalink)  
Antiguo 09/09/2008, 05:11
 
Fecha de Ingreso: febrero-2008
Mensajes: 75
Antigüedad: 16 años, 1 mes
Puntos: 0
ayuda urgente: Introducir los valores de las FK

Tengo las siguientes tablas:
CLIENTE
Codigo_cliente Integer NOT NULL Default nextval ('codigo_cliente_seq'),
Id_telefono_fijo Integer Default nextval ('Id_telefono_fijo_seq'),
DNI Char(9) NOT NULL,
Nombre Text NOT NULL,
Apellidos Text,
Direccion Text,
Codigo_Postal Integer,
Poblacion Text,
Provincia Text,
Puntos Integer Default 0,
primary key (Codigo_cliente)
TELEFONOS_FIJOS
Id_telefono_fijo Integer NOT NULL Default nextval ('Id_telefono_fijo_seq'),
Tel_Fijo Char(9),
primary key (Id_telefono_fijo)
Las FK son:
Id_telefono_fijo es FK en la tabla cliente
Para introducir un número de teléfono hago uso de la siguiente función:
Cita:
CREATE FUNCTION anadir_telefonos_fijos (CHAR) RETURNS void AS'
BEGIN
INSERT INTO telefonos_fijos (Tel_Fijo) VALUES ($1);
END;
'LANGUAGE 'plpgsql';
Pero a la hora de introducir los datos del cliente, tengo que introducir el Id_telefono_fijo, pero ¿cómo le indico cuál es el valor de la FK mediante funciones?

Había pensado en almacenar el valor del "Id_telefono_fijo" en una varaible:
Cita:
varaible := SELECT id_telefono_fijo FROM telefonos_fijos WHERE telefonos_fijos.Tel_Fijo = '917654321';

Pero me da el siguiente error:
Cita:
ERROR: syntax error at or near "varaible"
LINE 1: varaible := SELECT id_telefono_fijo FROM telefonos_fijos WHE...
^

********** Error **********

ERROR: syntax error at or near "varaible"
Estado SQL:42601
Caracter: 1
¿Alguna sugerencia?
  #2 (permalink)  
Antiguo 09/09/2008, 07:09
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 1 mes
Puntos: 13
Respuesta: ayuda urgente: Introducir los valores de las FK

Sugerencia: La misma de siempre, mirar la documentacion.....

Primero, usar una funcion plpgsql cuando no es necesario es mala idea.
Segundo, variable = select .... --> NO FUNCIONA, como se hace? Lo dice la documentación.... select x into VARIABLE ...

El diseño que has mostrado (desde mi punto de vista) es incorrecto.
clientes.Id_tlfn_fijo es FK, asi que cada cliente solo puede tener un telefono, entonces para que lo sacas de la tabla de clientes? No tiene sentido!

Si quieres hacerlo asi, podrías hacer:
Código:
CREATE FUNCTION anadir_telefonos_fijos (CHAR) RETURNS integer AS
$BODY$

DECLARE
id_t integer;

BEGIN
 id_t := nextval ('Id_telefono_fijo_seq');
    INSERT INTO telefonos_fijos (id_telefono_fijo, Tel_Fijo) VALUES (id_t, $1);
 return id_t;
END;
$BODY$ LANGUAGE 'plpgsql';
Salu2
  #3 (permalink)  
Antiguo 15/09/2008, 02:46
 
Fecha de Ingreso: febrero-2008
Mensajes: 75
Antigüedad: 16 años, 1 mes
Puntos: 0
Respuesta: ayuda urgente: Introducir los valores de las FK

A la hora de crear la función, me dice que hay un fallo:
Cita:
ERROR: error de sintaxis en o cerca de «Id_A_seq»
LINEA 6: id_t := currval ('Id_telefono_fijo_seq');
Lo que hago es quitarle las comillas simples y la crea, pero a la hora de llamar a la función, me dice que:
Cita:
LINEA 1: SELECT currval (Id_A_seq)
^
CONSULTA: SELECT currval (Id_A_seq)
CONTEXTO: PL/pgSQL function "anadir_b" line 5 at assignment

********** Error **********

ERROR: no existe la columna «iId_telefono_fijo_seq»
Estado SQL:42703
Contexto:PL/pgSQL function "anadir_telefonos_fijos" line 5 at assignment
  #4 (permalink)  
Antiguo 15/09/2008, 02:53
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 1 mes
Puntos: 13
Respuesta: ayuda urgente: Introducir los valores de las FK

porque le quitas las comillas? Dejale las comillas.

Si pones el codigo quizas podamos ver donde esta el fallo....

Salu2
  #5 (permalink)  
Antiguo 15/09/2008, 03:07
 
Fecha de Ingreso: febrero-2008
Mensajes: 75
Antigüedad: 16 años, 1 mes
Puntos: 0
Respuesta: ayuda urgente: Introducir los valores de las FK

Os explico lo que quiero hacer:
  • Tengo una BBDD :) con unas 18 tablas y unas 22 relaciones.
  • Tengo unas 15 funciones que se encargan de insertar los valores en todas las tablas. Y, como las PK de la mayoría de las tablas son secuencias, había pensado usar el comando "current" para introducir de forma automática el valor de la FK en vez de intrdoducir como parámetro de entrada un "integer"...
El código es el siguiente (he cambiado las varaibles para simplificar las cosas). No os preocupéis de que tenga sentido o no, sólo intento buscar una forma de simplificar las cosas.

Cita:
/* Create Sequences */
CREATE SEQUENCE Id_A_seq;
CREATE SEQUENCE Id_B_seq;
/* Create Tables */
Create table Entidad_A
(
Id_A Integer NOT NULL Default nextval ('Id_A_seq'),
Dato_A Text,
primary key (Id_A)
) Without Oids;

Alter Table Entidad_A add UNIQUE (Id_A);

Create table Entidad_B
(
Id_B Integer NOT NULL Default nextval ('Id_B_seq') UNIQUE,
Id_A Integer NOT NULL Default nextval ('Id_A_seq'),
Dato_B Text,
primary key (Id_B,Id_A)
) Without Oids;
/* Create Foreign Keys */
Alter table Entidad_B add foreign key (Id_A) references Entidad_A (Id_A) on update cascade on delete cascade;
/* Create Procedures */
CREATE OR REPLACE FUNCTION anadir_A (Text) RETURNS void AS'
BEGIN
INSERT INTO Entidad_A (Dato_A) VALUES ($1);
END;
'LANGUAGE 'plpgsql';
CREATE OR REPLACE FUNCTION anadir_B (Text) RETURNS void AS'
DECLARE
aux INTEGER;
BEGIN
aux := currval ('Id_A_seq');
INSERT INTO Entidad_B (Id_A, Dato_B) VALUES (aux, $1);
END;
'LANGUAGE 'plpgsql';

Última edición por larios_tnt; 15/09/2008 a las 03:42
  #6 (permalink)  
Antiguo 15/09/2008, 03:44
 
Fecha de Ingreso: febrero-2008
Mensajes: 75
Antigüedad: 16 años, 1 mes
Puntos: 0
Respuesta: ayuda urgente: Introducir los valores de las FK

Me voy a responder a mi mismo Para que funcione, había que poner dobles comillas simples
Cita:
aux := currval (''Id_A_seq'');
  #7 (permalink)  
Antiguo 15/09/2008, 06:03
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 1 mes
Puntos: 13
Respuesta: ayuda urgente: Introducir los valores de las FK

El problema es que inicias y finalizas la funcion con comillas, esto te complica mucho luego escribir dentro.
Si miras el codigo que escribo veras la solución.
Te aconsejo que no sigas haciendolo asi porque luego la cosa se va complicando con tanta comilla junta

salu2
  #8 (permalink)  
Antiguo 15/09/2008, 06:08
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 1 mes
Puntos: 13
Respuesta: ayuda urgente: Introducir los valores de las FK

ah ese diseño es más que problable que falle si tienes algo de concurrencia.
Como llamas a anadir_A y anadir_B?

Create table Entidad_B
(
Id_B Integer NOT NULL Default nextval ('Id_B_seq') UNIQUE,
Id_A Integer NOT NULL Default nextval ('Id_A_seq'),
Esto deberia ser un integer no un serial.
primary key (Id_B,Id_A)
Si id_B es UNIQUE id_A sobra en la PK.

Salu2
  #9 (permalink)  
Antiguo 15/09/2008, 06:19
 
Fecha de Ingreso: febrero-2008
Mensajes: 75
Antigüedad: 16 años, 1 mes
Puntos: 0
Respuesta: ayuda urgente: Introducir los valores de las FK

Cita:
Iniciado por seyko Ver Mensaje
ah ese diseño es más que problable que falle si tienes algo de concurrencia.
Como llamas a anadir_A y anadir_B?
SELECT anadir_A;
SELECT anadir_B;
Cita:
Iniciado por seyko Ver Mensaje
Create table Entidad_B
(
Id_B Integer NOT NULL Default nextval ('Id_B_seq') UNIQUE,
Id_A Integer NOT NULL Default nextval ('Id_A_seq'),
Esto deberia ser un integer no un serial.
primary key (Id_B,Id_A)
Si id_B es UNIQUE id_A sobra en la PK.
¿Por qué dices que sobra la PK id_A?
Cita:
Esto deberia ser un integer no un serial.
¿A qué te refieres con eso? Las PK son de tipo integer
  #10 (permalink)  
Antiguo 15/09/2008, 07:45
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 1 mes
Puntos: 13
Respuesta: ayuda urgente: Introducir los valores de las FK

Cita:
SELECT anadir_A;
SELECT anadir_B;
Y si otro usuario hace lo mismo:
Usuario1: select anadir_A; select anadir_B;
Usuario2: select anadir_A; select anadir_B;

Ejecución:
Usuario1: select anadir_A
Usuario2: select anadir_A
Usuario1: select anadir_B
Usuario2: select anadir_B

Las dos anadir_B tendran como currval el id de A del usuario 2.

Cita:
¿Por qué dices que sobra la PK id_A?
Porque el objetivo de una PK es identificar a un registro si id_B ya es unico, no te hace falta añadir id_A a la PK, porque le vale con id_B = UNIQUE

Cita:
¿A qué te refieres con eso? Las PK son de tipo integer
Si pero le tienes puesto que por defecto tome el siguiente valor de la secuencia, si lo vas a introducir tu no le pongas un serial dejalo como un integer sin valor por defecto.

Salu2
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:05.