Foros del Web

Foros del Web (http://www.forosdelweb.com/)
-   PostgreSQL (http://www.forosdelweb.com/f99/)
-   -   ENUM + AUTOINCREMET en Postgres (http://www.forosdelweb.com/f99/enum-autoincremet-postgres-561666/)

zkroj 28/02/2008 18:18

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 |
+--------+----+---------+

seyko 29/02/2008 02:24

Re: ENUM + AUTOINCREMET en Postgres
 
............. y???????

zkroj 04/03/2008 16:21

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

seyko 05/03/2008 02:07

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

zkroj 05/03/2008 11:36

Re: ENUM + AUTOINCREMET en Postgres
 
ok muchas gracias

bransh 05/03/2008 15:53

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)

seyko 06/03/2008 02:19

Re: ENUM + AUTOINCREMET en Postgres
 
Cita:

Iniciado por bransh (Mensaje 2310988)
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

bransh 06/03/2008 11:42

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

seyko 07/03/2008 05:38

Re: ENUM + AUTOINCREMET en Postgres
 
Cita:

Iniciado por bransh (Mensaje 2312248)
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

bransh 07/03/2008 07:51

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!

seyko 10/03/2008 02:29

Re: ENUM + AUTOINCREMET en Postgres
 
ahhh vale yo tampoco lei muy bien ;)

Salu2


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

Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.