viernes, junio 22, 2007

Tipos compuestos y creacion de tablas

Cuando en Postgres creamos una tabla implicitamente se crea un tipo de datos compuesto con el mismo nombre de la tabla, claro, que este tipo de dato no respeta las restricciones que hallamos creado junto con la tabla, veamos un ejemplo muy sencillo de este comportamiento y de como podemos utilizar nustro nuevo tipo en una función.

-- Prueba sobre tablas y tipos compuestos
CREATE TABLE foo (
fooid int,
foosubid int NOT NULL,
fooname text
);

-- Falla por la restriccion del NOT NULL
INSERT INTO foo VALUES (1,NULL,'prueba');

-- Cuando se crea la tabla foo se crea tambien un tipo compuesto foo, este tipo
-- sigue las mismas reglas que cuando se crea un tipo compuesto (no soporta los check).
CREATE FUNCTION test_composite_type (foo, integer)
RETURNS integer
LANGUAGE sql
AS $$
SELECT $1.fooid * $2;
$;

-- viola la regla del check impuesto en la tabla, pero no por el tipo
-- asi que esta funcion se ejecuta sin problemas y nos devuelve 2
SELECT test_composite_type (ROW(1,NULL,'prueba'),2);

CREATE TABLE nested_foo (
entero int,
tipo_foo foo
);

-- de nuevo inserta el tipo con el valor nulo
INSERT INTO nested_foo VALUES(1, ROW (1,NULL,'prueba'));
SELECT * FROM nested_foo;

-- solucion
CREATE DOMAIN foo_domain AS int
NOT NULL;

-- si no hacemos eso no nos deja alterar la tabla.
DROP TABLE nested_foo;
ALTER TABLE foo ALTER COLUMN foosubid TYPE foo_domain ;

-- marca error
-- ERROR: el dominio foo_domain no permite valores null
SELECT test_composite_type (ROW(1,NULL,'prueba'),2);

-- creamos de nuevo la tabla nested_foo
-- Ahora si obtenemos el siguiente error
-- ERROR: el dominio foo_domain no permite valores null
INSERT INTO nested_foo VALUES(1, ROW (1,NULL,'prueba'));




syntax highlighted by Code2HTML, v. 0.9.1

Para mayor informacion:
Composite Types
CREATE DOMAIN -- define a new domain
Publicar un comentario