Reynier Perez Mira escribió:
Hola Marcelo:
¿En la tabla modlic_licencias es donde debería poder dejarse el valor 
"id_categoria" como NULL cierto? Bien le he seteado el valor a NULL y nada me 
sigue dando el mismo error. Esta es la consulta SQL que se ejecuta cuando creo la FK.

ALTER TABLE public.modlic_categorias
  ADD CONSTRAINT fk_catlic
  FOREIGN KEY (id_categoria)
    REFERENCES public.modlic_licencias(id_categoria)
    ON DELETE SET NULL
    ON UPDATE CASCADE;


Ah, bueno, ahora sí puedo ver el problema. :-)

Primero, el ALTER TABLE debería ser sobre modlic_licencias (creo que esto es obvio), no sobre modlic_categorias. Y segundo, es que el campo modlic_licencias.id_categoria, al no ser PK, no tiene un índice creado que lo haga único [1]. Esto lo lográs diciendo que id_categoria es UNIQUE.

Pasé tu ejemplo a una base de prueba:

test=# CREATE TABLE public.modlic_licencias (
test(#   id_licencia        bigint NOT NULL,
test(#   id_categoria       bigint NULL UNIQUE,
test(#   id_autor           bigint NOT NULL,
test(#   nombre             varchar(50),
test(#   nodvd              integer NOT NULL,
test(#   fecha_creacion     date,
test(#   version            varchar(10),
test(#   documentacion      text,
test(#   sitio              varchar(150),
test(#   fecha_vencimiento  date,
test(#   privativo          boolean NOT NULL DEFAULT true,
test(#   CONSTRAINT licencia_software_pkey
test(#     PRIMARY KEY (id_licencia)
test(# ) WITH (
test(#     OIDS = FALSE
test(# );
NOTICE: CREATE TABLE / PRIMARY KEY creará el índice implícito «licencia_software_pkey» para la tabla «modlic_licencias» NOTICE: CREATE TABLE / UNIQUE creará el índice implícito «modlic_licencias_id_categoria_key» para la tabla «modlic_licencias»
CREATE TABLE
test=#
test=# CREATE TABLE public.modlic_categorias (
test(#   id_categoria      integer NOT NULL,
test(#   titulo_categoria  varchar(150) NOT NULL,
test(#   activa            boolean NOT NULL DEFAULT false,
test(#   CONSTRAINT modlic_categorias_pkey
test(#     PRIMARY KEY (id_categoria)
test(# ) WITH (
test(#     OIDS = FALSE
test(# );
NOTICE: CREATE TABLE / PRIMARY KEY creará el índice implícito «modlic_categorias_pkey» para la tabla «modlic_categorias»
CREATE TABLE
test=# ALTER TABLE public.modlic_licencias
test-#   ADD CONSTRAINT fk_catlic
test-#   FOREIGN KEY (id_categoria)
test-#     REFERENCES public.modlic_licencias(id_categoria)
test-#     ON DELETE SET NULL
test-#     ON UPDATE CASCADE;
ALTER TABLE
test=#

Ahora inserto valores en categorias:

test=# INSERT INTO modlic_categorias VALUES(1,'Categoria 1', True);
INSERT 0 1
test=# INSERT INTO modlic_categorias VALUES(2,'Categoria 2', True);
INSERT 0 1
test=# select * from modlic_categorias ;
 id_categoria | titulo_categoria | activa
--------------+------------------+--------
            1 | Categoria 1      | t
            2 | Categoria 2      | t
(2 filas)

Ahora inserto valores en licencias (la Licencia 2 va a ser la que tenga categoria NULL):

test=# INSERT INTO modlic_licencias VALUES(100,1,1000,'Licencia 1',0,NULL,NULL,NULL,NULL,NULL,True);
INSERT 0 1
test=# INSERT INTO modlic_licencias VALUES(150,NULL,1001,'Licencia 2',0,NULL,NULL,NULL,NULL,NULL,True);
INSERT 0 1
test=# INSERT INTO modlic_licencias VALUES(170,2,1004,'Licencia 3',0,NULL,NULL,NULL,NULL,NULL,False);
INSERT 0 1

Ahora revisamos que la 'Licencia 2' tenga una categoría NULL:

test=# select id_licencia, id_categoria, id_autor, nombre from modlic_licencias ;
 id_licencia | id_categoria | id_autor |   nombre
-------------+--------------+----------+------------
         100 |            1 |     1000 | Licencia 1
         150 |              |     1001 | Licencia 2
         170 |            2 |     1004 | Licencia 3
(3 filas)

Espero que ésto sea lo que andabas buscando. :-)

Saludos,
Marcelo
--
Marcelo F. Fernández
Buenos Aires, Argentina
Licenciado en Sistemas - CCNA

E-Mail: [EMAIL PROTECTED]
Jabber ID: [EMAIL PROTECTED]
Public Key ID: 5C990A6C 111C3661
Blog: http://marcelosoft.blogspot.com
--
TIP 1: para suscribirte y desuscribirte, visita 
http://archives.postgresql.org/pgsql-es-ayuda

Responder a