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

problema insertando la secuencia correcta en tipo de datos serial

Estas en el tema de problema insertando la secuencia correcta en tipo de datos serial en el foro de PostgreSQL en Foros del Web. tengo la sgte tabla... tasas serial character cod_tasa|descrip ---------------- 1 |porcentaje anual 2 |porcentaje mensual 3 |porcentaje trimestral la funcion para ingresar un nuevo registro ...
  #1 (permalink)  
Antiguo 23/04/2007, 09:20
 
Fecha de Ingreso: abril-2007
Mensajes: 27
Antigüedad: 17 años, 7 meses
Puntos: 0
problema insertando la secuencia correcta en tipo de datos serial

tengo la sgte tabla...
tasas
serial character
cod_tasa|descrip
----------------
1 |porcentaje anual
2 |porcentaje mensual
3 |porcentaje trimestral

la funcion para ingresar un nuevo registro es la sgte:

CREATE OR REPLACE FUNCTION alt_tasa( des1 bpchar)
RETURNS void AS
$BODY$declare
begin
INSERT INTO tasas
(descrip)
VALUES
(des1);
end;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION alt_tasa( des1 bpchar) OWNER TO postgres;

cuando ejecuto la funcion select alt_tasa('porcentaje semestral') me sale el sgte error.....
ERROR: duplicate key violates unique constraint "cod_tasa"
Estado SQL:23505
Contexto:SQL statement "INSERT INTO tasas (descrip) VALUES ($1)"
PL/pgSQL function "alt_uni" line 7 at SQL statement

por lo que lei esto no deberia ocurrir porque deberia insertarnos el numero que sigue en nuestra secuencia en este caso 4 pero como sabemos el error pasa porq al tratar de ingresar el campo cod_tasa que es de tipo serial obviamente esta tomando el valor de 1 si lo ejecuto nuevamente tomara el valor 2 y me dara el mismo error
modifique el insert

INSERT INTO tasas
(cod_tasa,descrip)
VALUES
(nextval('tasas_cod_tasa_seq'),des1);

y me sigue haciendo exactamente lo mismo sigue empezando de 1..
COmo puedo hacer para que mi campo serial ingrese apartir del ultimo registro?
es decir en este caso 4
ayuda porfa es urgente... gracias
  #2 (permalink)  
Antiguo 24/04/2007, 06:37
 
Fecha de Ingreso: agosto-2005
Ubicación: Mérida, Venezuela
Mensajes: 732
Antigüedad: 19 años, 2 meses
Puntos: 7
Re: problema insertando la secuencia correcta en tipo de datos serial

Saludos

Cita:
Iniciado por mariovargascareaga Ver Mensaje
tengo la sgte tabla...
tasas
serial character
cod_tasa|descrip
----------------
1 |porcentaje anual
2 |porcentaje mensual
3 |porcentaje trimestral

la funcion para ingresar un nuevo registro es la sgte:

CREATE OR REPLACE FUNCTION alt_tasa( des1 bpchar)
RETURNS void AS
$BODY$declare
begin
INSERT INTO tasas
(descrip)
VALUES
(des1);
end;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION alt_tasa( des1 bpchar) OWNER TO postgres;
Hasta aquí...

Código:
pruebas=# CREATE TABLE tasas (cod_tasa serial, descrip varchar(5));
NOTICE:  CREATE TABLE creará una secuencia implícita «tasas_cod_tasa_seq» para la columna serial «tasas.cod_tasa»
CREATE TABLE

pruebas=# INSERT INTO tasas (descrip) VALUES ('anual');
INSERT 0 1
pruebas=# INSERT INTO tasas (descrip) VALUES ('mens');
INSERT 0 1
pruebas=# INSERT INTO tasas (descrip) VALUES ('semes');
INSERT 0 1

pruebas=# SELECT * FROM tasas;
 cod_tasa | descrip
----------+-------------
        1 | anual
        2 | mens
        3 | semes
(3 filas)

pruebas=# CREATE OR REPLACE FUNCTION alt_tasa( des1 bpchar)
pruebas-# RETURNS void AS
pruebas-# $BODY$declare
pruebas$# begin
pruebas$# INSERT INTO tasas
pruebas$# (descrip)
pruebas$# VALUES
pruebas$# (des1);
pruebas$# end;
pruebas$# $BODY$
pruebas-# LANGUAGE 'plpgsql' VOLATILE;
CREATE FUNCTION
pruebas=# ALTER FUNCTION alt_tasa( des1 bpchar) OWNER TO postgres;
ALTER FUNCTION

pruebas=# SELECT alt_tasa('porc');
 alt_tasa
----------

(1 fila)

pruebas=# SELECT * FROM tasas;
 cod_tasa | descrip
----------+---------
        1 | anual
        2 | mens
        3 | semes
        4 | porc
(4 filas)
La función, copie y pegue... como veras, me funciona sin problemas...

Cita:
Iniciado por mariovargascareaga Ver Mensaje
cuando ejecuto la funcion select alt_tasa('porcentaje semestral') me sale el sgte error.....
ERROR: duplicate key violates unique constraint "cod_tasa"
Estado SQL:23505
Contexto:SQL statement "INSERT INTO tasas (descrip) VALUES ($1)"
PL/pgSQL function "alt_uni" line 7 at SQL statement

por lo que lei esto no deberia ocurrir porque deberia insertarnos el numero que sigue en nuestra secuencia en este caso 4 pero como sabemos el error pasa porq al tratar de ingresar el campo cod_tasa que es de tipo serial obviamente esta tomando el valor de 1 si lo ejecuto nuevamente tomara el valor 2 y me dara el mismo error
raro... algo demás debes estar haciendo que no estás comentando...
Cita:
Iniciado por mariovargascareaga Ver Mensaje
modifique el insert

INSERT INTO tasas
(cod_tasa,descrip)
VALUES
(nextval('tasas_cod_tasa_seq'),des1);
aquí, sí hay un error... y distinto al que mencionas más adelante... sí ejecutas tal cual, debería botar:

ERROR: no existe la columna «des1»

ya que el segundo parámetro está esperando un varchar, y no es lo que le estás pasando... corrigiendo:

Código:
pruebas=# INSERT INTO tasas
pruebas-# (cod_tasa,descrip)
pruebas-# VALUES
pruebas-# (nextval('tasas_cod_tasa_seq'),'des1');
INSERT 0 1
pruebas=# SELECT * FROM tasas;
 cod_tasa | descrip
----------+---------
        1 | anual
        2 | mens
        3 | semes
        4 | porc
        5 | des1
(5 filas)
donde se ve, que funciona perfectamente...

Cita:
Iniciado por mariovargascareaga Ver Mensaje
y me sigue haciendo exactamente lo mismo sigue empezando de 1..
COmo puedo hacer para que mi campo serial ingrese apartir del ultimo registro?
es decir en este caso 4
ayuda porfa es urgente... gracias
Urgente? haberlo dicho antes... son 35€
__________________
Gracias de todas todas
-----
Linux!
  #3 (permalink)  
Antiguo 24/04/2007, 07:41
 
Fecha de Ingreso: abril-2007
Mensajes: 27
Antigüedad: 17 años, 7 meses
Puntos: 0
Re: problema insertando la secuencia correcta en tipo de datos serial

pruebas=# CREATE TABLE tasas (cod_tasa serial, descrip varchar(5));
NOTICE: CREATE TABLE creará una secuencia implícita «tasas_cod_tasa_seq» para la columna serial «tasas.cod_tasa»
CREATE TABLE

pruebas=# INSERT INTO tasas (descrip) VALUES ('anual');
INSERT 0 1
pruebas=# INSERT INTO tasas (descrip) VALUES ('mens');
INSERT 0 1
pruebas=# INSERT INTO tasas (descrip) VALUES ('semes');
INSERT 0 1

pruebas=# SELECT * FROM tasas;
cod_tasa | descrip
----------+-------------
1 | anual
2 | mens
3 | semes
(3 filas)

pruebas=# CREATE OR REPLACE FUNCTION alt_tasa( des1 bpchar)
pruebas-# RETURNS void AS
pruebas-# $BODY$declare
pruebas$# begin
pruebas$# INSERT INTO tasas
pruebas$# (descrip)
pruebas$# VALUES
pruebas$# (des1);
pruebas$# end;
pruebas$# $BODY$
pruebas-# LANGUAGE 'plpgsql' VOLATILE;
CREATE FUNCTION
pruebas=# ALTER FUNCTION alt_tasa( des1 bpchar) OWNER TO postgres;
ALTER FUNCTION

pruebas=# SELECT alt_tasa('porc');
alt_tasa
----------

(1 fila)

pruebas=# SELECT * FROM tasas;
cod_tasa | descrip
----------+---------
1 | anual
2 | mens
3 | semes
4 | porc
(4 filas)


La función, copie y pegue... como veras, me funciona sin problemas...

correctisimo lo que afirmas lo que pasa es que tu estas ingresando los registros desde el primer registro osea estas inicializando la secuencia del serial pero mi caso pasa que las tablas ya tienen los registros son tablas de mas de 10000 datos y cuando trato de ingresar un nuevo registro siempre se inicializa el serial entonces como lo expuse necesito que inicie la serializacion desde el ultimo registro por lo que vi puedo usar la funcion currval() estoy en eso si lo consigo te aviso ....ahhh lo de urgente es una forma de ...... no te preocupes gracias
  #4 (permalink)  
Antiguo 24/04/2007, 08:36
 
Fecha de Ingreso: agosto-2005
Ubicación: Mérida, Venezuela
Mensajes: 732
Antigüedad: 19 años, 2 meses
Puntos: 7
Re: problema insertando la secuencia correcta en tipo de datos serial

la secuencia no se inicializa sola!

¿hiciste algún dump? o algo más que no estás contando?

currval? mmm, a ver... estás migrando una BD... ¿cómo lo estás haciendo?

quizás te interese nextval()
__________________
Gracias de todas todas
-----
Linux!
  #5 (permalink)  
Antiguo 24/04/2007, 14:09
 
Fecha de Ingreso: abril-2007
Mensajes: 27
Antigüedad: 17 años, 7 meses
Puntos: 0
Re: problema insertando la secuencia correcta en tipo de datos serial

Cita:
Iniciado por cacr Ver Mensaje
la secuencia no se inicializa sola!

¿hiciste algún dump? o algo más que no estás contando?

currval? mmm, a ver... estás migrando una BD... ¿cómo lo estás haciendo?

quizás te interese nextval()

si estoy migrando una bd por ende las tablas ya contienen registros cuando trato de ingresar un registro siempre la secuencia empieza en 1 asi le ponga el nextval
  #6 (permalink)  
Antiguo 24/04/2007, 14:22
 
Fecha de Ingreso: agosto-2005
Ubicación: Mérida, Venezuela
Mensajes: 732
Antigüedad: 19 años, 2 meses
Puntos: 7
Re: problema insertando la secuencia correcta en tipo de datos serial

ok...

http://www.postgresql.org/docs/7.4/i...-sequence.html
__________________
Gracias de todas todas
-----
Linux!
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 11:33.