Retroceder   Foros del Web > Programación para sitios web > Bases de Datos > PostgreSQL

Respuesta
 
Herramientas Desplegado
Antiguo 28-feb-2008, 17:18   #1 (permalink)
zkroj ha deshabilitado el karma
 
Fecha de Ingreso: febrero-2008
Mensajes: 3
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 |
+--------+----+---------+
zkroj está desconectado   Responder Citando
Antiguo 29-feb-2008, 01:24   #2 (permalink)
seyko ha deshabilitado el karma
 
Fecha de Ingreso: febrero-2007
Mensajes: 936
Re: ENUM + AUTOINCREMET en Postgres

............. y???????
seyko está desconectado   Responder Citando
Antiguo 04-mar-2008, 15:21   #3 (permalink)
zkroj ha deshabilitado el karma
 
Fecha de Ingreso: febrero-2008
Mensajes: 3
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
zkroj está desconectado   Responder Citando
Antiguo 05-mar-2008, 01:07   #4 (permalink)
seyko ha deshabilitado el karma
 
Fecha de Ingreso: febrero-2007
Mensajes: 936
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
seyko está desconectado   Responder Citando
Antiguo 05-mar-2008, 10:36   #5 (permalink)
zkroj ha deshabilitado el karma
 
Fecha de Ingreso: febrero-2008
Mensajes: 3
Re: ENUM + AUTOINCREMET en Postgres

ok muchas gracias
zkroj está desconectado   Responder Citando
Antiguo 05-mar-2008, 14:53   #6 (permalink)
bransh no se puede cailificar en este momento
 
Fecha de Ingreso: enero-2008
Mensajes: 24
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)
bransh está desconectado   Responder Citando
Antiguo 06-mar-2008, 01:19   #7 (permalink)
seyko ha deshabilitado el karma
 
Fecha de Ingreso: febrero-2007
Mensajes: 936
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
seyko está desconectado   Responder Citando
Antiguo 06-mar-2008, 10:42   #8 (permalink)
bransh no se puede cailificar en este momento
 
Fecha de Ingreso: enero-2008
Mensajes: 24
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
bransh está desconectado   Responder Citando
Antiguo 07-mar-2008, 04:38   #9 (permalink)
seyko ha deshabilitado el karma
 
Fecha de Ingreso: febrero-2007
Mensajes: 936
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
seyko está desconectado   Responder Citando
Antiguo 07-mar-2008, 06:51   #10 (permalink)
bransh no se puede cailificar en este momento
 
Fecha de Ingreso: enero-2008
Mensajes: 24
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!
bransh está desconectado   Responder Citando
Antiguo 10-mar-2008, 02:29   #11 (permalink)
seyko ha deshabilitado el karma
 
Fecha de Ingreso: febrero-2007
Mensajes: 936
Re: ENUM + AUTOINCREMET en Postgres

ahhh vale yo tampoco lei muy bien ;)

Salu2
seyko está desconectado   Responder Citando
Respuesta
No hay votos aún.


Herramientas
Desplegado

Normas de Publicación
No puedes crear nuevos temas
No puedes responder temas
No puedes subir archivos adjuntos
No puedes editar tus mensajes

BB code is Activado
Caritas están Activado
[IMG] está Activado
Código HTML está Desactivado


La Zona horaria es GMT -6. Ahora son las 23:49.


Message Board Statistics

LinkBacks Enabled by vBSEO 3.1.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93