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

ENUM + AUTOINCREMET en Postgres

Estas en el tema de ENUM + AUTOINCREMET en Postgres en el foro de PostgreSQL en Foros del Web. Hola: Estoy mudando una base de datos de MySQL a Postgrest tengo una tabla que cuenta con un auto incremen pero este depende de otra ...
  #1 (permalink)  
Antiguo 28/02/2008, 18:18
 
Fecha de Ingreso: febrero-2008
Mensajes: 3
Antigüedad: 16 años, 2 meses
Puntos: 0
ENUM + AUTOINCREMET en Postgres

Hola:

Estoy mudando una base de datos de MySQL a Postgrest tengo una tabla que cuenta con un auto incremen pero este depende de otra columna que es de tipo ENUM y la columna auto imcrement se aunmenta segun el valor de la variable ENUM, aqui pongo un ejemplo en MySQL.


CREATE TABLE animals (
grp ENUM('fish','mammal','bird') NOT NULL,
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR(30) NOT NULL,
PRIMARY KEY (grp,id)
);
INSERT INTO animals (grp,name) VALUES('mammal','dog'),('mammal','cat'),
('bird','penguin'),('fish','lax'),('mammal','whale '),
('bird','ostrich');
SELECT * FROM animals ORDER BY grp,id;

Lo cual devuelve:

+-------------+----+---------+
| grp | id | name |
+-------------+----+---------+
| fish | 1 | lax |
| mammal | 1 | dog |
| mammal | 2 | cat |
| mammal | 3 | whale |
| bird | 1 | penguin |
| bird | 2 | ostrich |
+--------+----+---------+
  #2 (permalink)  
Antiguo 29/02/2008, 02:24
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 3 meses
Puntos: 13
Re: ENUM + AUTOINCREMET en Postgres

............. y???????
  #3 (permalink)  
Antiguo 04/03/2008, 16:21
 
Fecha de Ingreso: febrero-2008
Mensajes: 3
Antigüedad: 16 años, 2 meses
Puntos: 0
Re: ENUM + AUTOINCREMET en Postgres

como puedo hacer que se autoincremente automaticamente dependiendo de la otra columna por que si pongo un serial normal autoincremente sin tomar en centa la otra columna
  #4 (permalink)  
Antiguo 05/03/2008, 02:07
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 3 meses
Puntos: 13
Re: ENUM + AUTOINCREMET en Postgres

Buenas,

Puedes hacerlo con un trigger, tu insertas el grupo y el nombre y el trigger rellena el id.
No utilizo MySql, pero dudo que haga esto de forma "trivial", como lo hacias en MySql?

Un saludo
  #5 (permalink)  
Antiguo 05/03/2008, 11:36
 
Fecha de Ingreso: febrero-2008
Mensajes: 3
Antigüedad: 16 años, 2 meses
Puntos: 0
Re: ENUM + AUTOINCREMET en Postgres

ok muchas gracias
  #6 (permalink)  
Antiguo 05/03/2008, 15:53
 
Fecha de Ingreso: enero-2008
Mensajes: 25
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: ENUM + AUTOINCREMET en Postgres

Hola como andas.

En postgres no existe el tipo ENUM, pero lo podemos simular muy facilmente:

Código:
CREATE TABLE animals (
    grp VARCHAR(255) NOT NULL,
    id INTEGER NOT NULL,
    name CHAR(30) NOT NULL,
    
    PRIMARY KEY (grp,id),
    CHECK (grp IN ('fish','mammal','bird'))
);
El Check Constraint impedira que se ingrese algo distinto

Luego, para tomar los id que vos queres, deberias ejecutar una sentencia como al siguiente:


Código:
INSERT INTO animals
VALUES ('bird', COALESCE((SELECT MAX(id) FROM animals 
WHERE grp = 'bird'), 0) + 1, 'penguin')
Espero te sirva!
Saludos

P/D: la funcion coalesce existe en la mayoria de los DB si no es en todos, y te
devuelve el primer elemento no nulo de la serie que vos le pasas, en este caso
el maximo id para el grupo X de la tabla animales y el numero 0.
(ahora si, salu2)
  #7 (permalink)  
Antiguo 06/03/2008, 02:19
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 3 meses
Puntos: 13
Re: ENUM + AUTOINCREMET en Postgres

Cita:
Iniciado por bransh Ver Mensaje
Hola como andas.

En postgres no existe el tipo ENUM, pero lo podemos simular muy facilmente:
No existe como ENUM pero mira CREATE DOMAIN.

Salu2
  #8 (permalink)  
Antiguo 06/03/2008, 11:42
 
Fecha de Ingreso: enero-2008
Mensajes: 25
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: ENUM + AUTOINCREMET en Postgres

Efectivamente mi estimado seyko, y en la creacion de un dominio usaria una vez mas:

CHECK (grp IN ('fish','mammal','bird'))

Igualmente insisto en que postgres no posee como tipo nativo ENUM a diferencia del motor del cual proviene nuestro estimado zkroj, en el cual ademas de los DOMINIOS tambien encontramos como tipo nativo ENUM.

Salu2
  #9 (permalink)  
Antiguo 07/03/2008, 05:38
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 3 meses
Puntos: 13
Re: ENUM + AUTOINCREMET en Postgres

Cita:
Iniciado por bransh Ver Mensaje
Efectivamente mi estimado seyko, y en la creacion de un dominio usaria una vez mas:

CHECK (grp IN ('fish','mammal','bird'))

Igualmente insisto en que postgres no posee como tipo nativo ENUM a diferencia del motor del cual proviene nuestro estimado zkroj, en el cual ademas de los DOMINIOS tambien encontramos como tipo nativo ENUM.

Salu2
Perdona que te corrija pero si defines un DOMAIN llamesmolo "animal" con los valores 'fish', ....

y luego defines el campo:
create table ...

grp animal,
...

no hace falta el check.

Y si con un trigger rellena el id automaticamente, se quita tener que buscar el id en el insert:
Código:
INSERT INTO animals
VALUES ('bird', COALESCE((SELECT MAX(id) FROM animals 
WHERE grp = 'bird'), 0) + 1, 'penguin')
Un saludo
  #10 (permalink)  
Antiguo 07/03/2008, 07:51
 
Fecha de Ingreso: enero-2008
Mensajes: 25
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: ENUM + AUTOINCREMET en Postgres

Hola, parece que me exprese suficientemente mal...

Cuando dije:

"Efectivamente mi estimado seyko, y en la creacion de un dominio usaria una vez mas:
CHECK (grp IN ('fish','mammal','bird')) "

me referia a algo asi como:

CREATE DOMAIN animal AS VARCHAR(255)
CHECK(VALUE IN ('fish','mammal','bird'));

para la creacion del dominio, y como tu dices:

CREATE TABLE animals (
grp animal NOT NULL,
id INTEGER NOT NULL,
name CHAR(30) NOT NULL,

PRIMARY KEY (grp,id)
);


Saludos!
  #11 (permalink)  
Antiguo 10/03/2008, 02:29
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 3 meses
Puntos: 13
Re: ENUM + AUTOINCREMET en Postgres

ahhh vale yo tampoco lei muy bien ;)

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 11:32.