Problems with Constraints in PostgreSQL

2

I'm having a problem with PostgreSQL, 8.1.

Adding constraints returns the same error: SQL error:

  

ERROR: there is no unique constraint matching given keys   referenced table "

Here is the code I'm using:

CREATE TABLE "administrador"  ( 
    "administrador_id"  serial NOT NULL,
    "nome"              varchar(200) NOT NULL,
    "cpf"               varchar(14) NOT NULL,
    "rg"                varchar(11) NOT NULL,
    "email"             varchar(200) NOT NULL,
    "endereco"          varchar(255) NOT NULL,
    "numero_endereco"   varchar(15) NOT NULL,
    "complemento"       varchar(255) NULL,
    "bairro"            varchar(255) NOT NULL,
    "cep"               varchar(9) NOT NULL,
    "cidade"            varchar(255) NOT NULL,
    "uf"                char(2) NOT NULL ,
    "telefone"          varchar(21) NOT NULL,
    "data_cadastro"     date NOT NULL,
    "status"            char(1) NOT NULL DEFAULT 1,
    "senha"             varchar(100) NOT NULL,
    PRIMARY KEY("administrador_id")
);
COMMENT ON COLUMN "administrador"."cpf" IS '999.999.999-99';
COMMENT ON COLUMN "administrador"."rg" IS '9.999.999';
COMMENT ON COLUMN "administrador"."cep" IS '99999-999';
COMMENT ON COLUMN "administrador"."uf" IS 'Estado';
COMMENT ON COLUMN "administrador"."telefone" IS '+99 (999) 9-9999-9999';
COMMENT ON COLUMN "administrador"."status" IS '0 = Inativo; 1 = Ativo';


CREATE TABLE "chamado"  ( 
    "chamado_id"                    bigserial NOT NULL,
    "empresa_cliente_empresa_id"    integer NOT NULL,
    "titulo"                        varchar(200) NOT NULL,
    "breve_descricao"               varchar(255) NOT NULL,
    "descricao"                     text NULL,
    "data"                          date NOT NULL,
    "horario"                       time NOT NULL,
    "urgencia"                      char(1) NOT NULL DEFAULT 0,
    "usuario_solicitante"           integer NULL,
    "usuario_responsavel"           integer NOT NULL,
    "status"                        char(1) NOT NULL,
    PRIMARY KEY("chamado_id","empresa_cliente_empresa_id","usuario_solicitante","usuario_responsavel")
);
COMMENT ON COLUMN "chamado"."urgencia" IS '0 = Extremamente Baixa; 1 = Baixa; 2 = Normal; 3 = Alta; 4 = Extremamente Alta';
COMMENT ON COLUMN "chamado"."status" IS '0 = Pendente; 1 = Em Atendimento; 3 = Atendido, mas não resolvido; 4 = Atendido e resolvido';

CREATE TABLE "dado_extra_administrador"  ( 
    "administrador_administrador_id"    integer NOT NULL,
    "dado_id"                           serial NOT NULL,
    "descricao"                         varchar(255) NOT NULL,
    PRIMARY KEY("administrador_administrador_id","dado_id")
);

CREATE TABLE "dado_extra_empresa_cliente"  ( 
    "empresa_cliente_empresa_id"    integer NOT NULL,
    "dado_id"                       serial NOT NULL,
    "descricao"                     varchar(255) NOT NULL,
    PRIMARY KEY("empresa_cliente_empresa_id","dado_id")
);

CREATE TABLE "dado_extra_usuario"  ( 
    "usuario_usuario_id"    integer NOT NULL,
    "dado_id"               serial NOT NULL,
    "descricao"             varchar(255) NOT NULL,
    PRIMARY KEY("usuario_usuario_id","dado_id")
);

CREATE TABLE "departamento"  ( 
    "projeto_empresa_cliente_empresa_id"    integer NOT NULL,
    "projeto_projeto_id"                    integer NOT NULL,
    "departamento_id"                       serial NOT NULL,
    "titulo"                                varchar(200) NOT NULL,
    "descricao"                             text NOT NULL,
    "data_criacao"                          date NOT NULL,
    "coordernadas_mapa"                     text NOT NULL,
    "coordernadas_posicionamento"           text NOT NULL,
    "cor_mapa"                              varchar(10) NOT NULL,
    "status"                                char(1) NOT NULL DEFAULT 1,
    PRIMARY KEY("projeto_empresa_cliente_empresa_id","projeto_projeto_id","departamento_id")
);
COMMENT ON COLUMN "departamento"."status" IS '0 = Inativo; 1 = Ativo';


CREATE TABLE "empresa_cliente"  ( 
    "empresa_id"        serial NOT NULL,
    "nome_fantasia"     varchar(255) NOT NULL,
    "razao_social"      varchar(255) NOT NULL,
    "cnpj"              varchar(18) NOT NULL,
    "endereco"          varchar(200) NOT NULL,
    "numero_endereco"   varchar(15) NOT NULL,
    "complemento"       varchar(255) NULL,
    "bairro"            varchar(200) NOT NULL,
    "cep"               varchar(9) NOT NULL,
    "cidade"            varchar(200) NOT NULL,
    "uf"                char(2) NOT NULL ,
    "email"             varchar(200) NOT NULL,
    "data_cadastro"     date NOT NULL,
    "status"            char(1) NOT NULL DEFAULT 1,
    PRIMARY KEY("empresa_id")
);
COMMENT ON COLUMN "empresa_cliente"."cnpj" IS '99.999.999/9999-99';
COMMENT ON COLUMN "empresa_cliente"."cep" IS '99999-999';
COMMENT ON COLUMN "empresa_cliente"."status" IS '0 = Inativa; 1 = Ativa';
CREATE TABLE "equipamento"  ( 
    "equipamento_id"                                        serial NOT NULL,
    "sala_sala_id"                                          integer NOT NULL,
    "sala_departamento_departamento_id"                     integer NOT NULL,
    "sala_departamento_projeto_projeto_id"                  integer NOT NULL,
    "sala_departamento_projeto_empresa_cliente_empresa_id"  integer NOT NULL,
    "titulo"                                                varchar(200) NOT NULL,
    "descricao"                                             text NOT NULL,
    "data_criacao"                                          date NOT NULL,
    "status"                                                char(1) NOT NULL DEFAULT 1,
    "coordenadas_design"                                    text NOT NULL,
    "cordenadas_posicionamento"                             text NOT NULL,
    "cor_design"                                            varchar(10) NOT NULL,
    PRIMARY KEY("equipamento_id","sala_sala_id","sala_departamento_departamento_id","sala_departamento_projeto_projeto_id","sala_departamento_projeto_empresa_cliente_empresa_id")
);
COMMENT ON COLUMN "equipamento"."status" IS '0 = Inativo; 1 = Ativo';
CREATE TABLE "funcionalidade_administrador"  ( 
    "funcionalidade_id" serial NOT NULL,
    "descricao"         varchar(255) NOT NULL,
    "status"            char(1) NOT NULL DEFAULT 1,
    PRIMARY KEY("funcionalidade_id")
);
COMMENT ON COLUMN "funcionalidade_administrador"."status" IS '0 = Inativa/Oculta; 1 = Ativa';
CREATE TABLE "funcionalidade_usuario"  ( 
    "funcionalidade_id" serial NOT NULL,
    "descricao"         varchar(255) NOT NULL,
    "status"            char(1) NOT NULL DEFAULT 1,
    PRIMARY KEY("funcionalidade_id")
);
COMMENT ON COLUMN "funcionalidade_usuario"."status" IS '0 = Inativa/Oculta; 1 = Ativa';
CREATE TABLE "item_invetario_empresa_cliente"  ( 
    "item_id"                       bigserial NOT NULL,
    "empresa_cliente_empresa_id"    integer NOT NULL,
    "titulo"                        varchar(200) NOT NULL,
    "descricao"                     text NOT NULL,
    "data_cadastro"                 date NOT NULL,
    "valor_item"                    float NOT NULL,
    PRIMARY KEY("item_id","empresa_cliente_empresa_id")
);
CREATE TABLE "log_atividade_usuario"  ( 
    "usuario_usuario_id"                    integer NOT NULL,
    "usuario_empresa_cliente_empresa_id"    integer NOT NULL,
    "log_id"                                bigserial NOT NULL,
    "data"                                  date NOT NULL,
    "horario"                               time NOT NULL,
    "descricao"                             varchar(255) NOT NULL,
    PRIMARY KEY("usuario_empresa_cliente_empresa_id","log_id","usuario_usuario_id")
);
CREATE TABLE "procedimento_chamado"  ( 
    "procedimento_id"                               serial NOT NULL,
    "chamado_id"                                    varchar(25) NOT NULL,
    "descricao"                                     text NOT NULL,
    "data"                                          date NOT NULL,
    "horario"                                       time NOT NULL,
    "chamado_empresa_empresa_cliente_empresa_id"    integer NOT NULL,
    PRIMARY KEY("procedimento_id","chamado_id","chamado_empresa_empresa_cliente_empresa_id")
);
CREATE TABLE "projeto"  ( 
    "empresa_cliente_empresa_id"    integer NOT NULL,
    "projeto_id"                    serial NOT NULL,
    "titulo"                        varchar(200) NOT NULL,
    "descricao"                     text NOT NULL,
    "data_criacao"                  date NOT NULL,
    "status"                        char(1) NOT NULL DEFAULT 1,
    "coordenadas_mapa"              text NOT NULL,
    "cor_mapa"                      varchar(10) NOT NULL,
    PRIMARY KEY("projeto_id","empresa_cliente_empresa_id")
);
COMMENT ON COLUMN "projeto"."status" IS '0 = Inativo; 1 = Ativo';
CREATE TABLE "relacao_categoria_chamado"  ( 
    "chamado_id"                                    varchar(25) NOT NULL,
    "projeto_projeto_id"                            integer NULL,
    "departamento_departamento_id"                  integer NULL,
    "sala_sala_id"                                  integer NULL,
    "equipamento_equipamento_id"                    integer NULL,
    "categoria"                                     varchar(50) NOT NULL,
    "chamado_empresa_empresa_cliente_empresa_id"    integer NOT NULL,
    PRIMARY KEY("chamado_id","projeto_projeto_id","departamento_departamento_id","sala_sala_id","equipamento_equipamento_id","categoria","chamado_empresa_empresa_cliente_empresa_id")
);
COMMENT ON COLUMN "relacao_categoria_chamado"."categoria" IS 'projeto, departamento, sala ou equipamento';
CREATE TABLE "relacao_fun_admin"  ( 
    "administrador_administrador_id"                    integer NOT NULL,
    "funcionalidade_administrador_funcionalidade_id"    integer NOT NULL,
    PRIMARY KEY("administrador_administrador_id","funcionalidade_administrador_funcionalidade_id")
);
CREATE TABLE "relacao_fun_user"  ( 
    "usuario_usuario_id"                        integer NOT NULL,
    "funcionalidade_usuario_funcionalidade_id"  integer NOT NULL,
    PRIMARY KEY("usuario_usuario_id","funcionalidade_usuario_funcionalidade_id")
);
CREATE TABLE "relacao_proce_item_inven"  ( 
    "item_inventario_empresa_cliente_item_id"   integer NOT NULL,
    "procedimento_chamado_procedimento_id"      varchar(25) NOT NULL,
    "data"                                      date NOT NULL,
    "horario"                                   time NOT NULL,
    PRIMARY KEY("item_inventario_empresa_cliente_item_id","procedimento_chamado_procedimento_id")
);
CREATE TABLE "sala"  ( 
    "sala_id"                                           serial NOT NULL,
    "departamento_departamento_id"                      integer NOT NULL,
    "departamento_projeto_empresa_cliente_empresa_id"   varchar(25) NOT NULL,
    "departamento_projeto_projeto_id"                   varchar(25) NOT NULL,
    "titulo"                                            varchar(200) NOT NULL,
    "descricao"                                         text NOT NULL,
    "staus"                                             char(1) NOT NULL DEFAULT 1,
    "data_criacao"                                      date NOT NULL,
    "coordenadas_mapa"                                  text NOT NULL,
    "coordenadas_posicionamento"                        text NOT NULL,
    "cor_mapa"                                          varchar(10) NOT NULL,
    PRIMARY KEY("sala_id","departamento_departamento_id","departamento_projeto_empresa_cliente_empresa_id","departamento_projeto_projeto_id")
);
COMMENT ON COLUMN "sala"."staus" IS '0 = Inativo; 1 = Ativo';
CREATE TABLE "usuario"  ( 
    "empresa_cliente_empresa_id"    integer NOT NULL,
    "usuario_id"                    serial NOT NULL,
    "nome"                          varchar(200) NOT NULL,
    "cpf"                           varchar(14) NOT NULL,
    "rg"                            varchar(11) NOT NULL,
    "email"                         varchar(200) NOT NULL,
    "endereco"                      varchar(255) NOT NULL,
    "numero_endereco"               varchar(15) NOT NULL,
    "complemento"                   varchar(255) NULL,
    "bairro"                        varchar(255) NOT NULL,
    "cep"                           varchar(9) NOT NULL,
    "cidade"                        varchar(255) NOT NULL,
    "uf"                            char(2) NOT NULL ,
    "telefone"                      varchar(21) NOT NULL,
    "data_cadastro"                 date NOT NULL,
    "status"                        char(1) NOT NULL DEFAULT 1,
    "senha"                         varchar(100) NOT NULL,
    PRIMARY KEY("usuario_id","empresa_cliente_empresa_id")
);
COMMENT ON COLUMN "usuario"."cpf" IS '999.999.999-99';
COMMENT ON COLUMN "usuario"."rg" IS '9.999.999';
COMMENT ON COLUMN "usuario"."cep" IS '99999-999';
COMMENT ON COLUMN "usuario"."uf" IS 'Estado';
COMMENT ON COLUMN "usuario"."telefone" IS '+99 (999) 9-9999-9999';
COMMENT ON COLUMN "usuario"."status" IS '0 = Inativo; 1 = Ativo';
ALTER TABLE "dado_extra_administrador"
    ADD CONSTRAINT "REL_5"
    FOREIGN KEY("administrador_administrador_id")
    REFERENCES "administrador"("administrador_id")
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION ;
ALTER TABLE "relacao_fun_admin"
    ADD CONSTRAINT "REL_9"
    FOREIGN KEY("administrador_administrador_id")
    REFERENCES "administrador"("administrador_id")
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION ;
ALTER TABLE "relacao_categoria_chamado"
    ADD CONSTRAINT "REL_25"
    FOREIGN KEY("chamado_id", "chamado_empresa_empresa_cliente_empresa_id")
    REFERENCES "chamado"("chamado_id", "empresa_cliente_empresa_id")
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION ;
ALTER TABLE "procedimento_chamado"
    ADD CONSTRAINT "REL_17"
    FOREIGN KEY("chamado_id", "chamado_empresa_empresa_cliente_empresa_id")
    REFERENCES "chamado"("chamado_id", "empresa_cliente_empresa_id")
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION ;
ALTER TABLE "sala"
    ADD CONSTRAINT "REL_12"
    FOREIGN KEY("departamento_projeto_empresa_cliente_empresa_id", "departamento_projeto_projeto_id", "departamento_departamento_id")
    REFERENCES "departamento"("projeto_empresa_cliente_empresa_id", "projeto_projeto_id", "departamento_id")
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION ;
ALTER TABLE "relacao_categoria_chamado"
    ADD CONSTRAINT "REL_19"
    FOREIGN KEY("departamento_departamento_id")
    REFERENCES "departamento"("departamento_id")
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION ;
ALTER TABLE "usuario"
    ADD CONSTRAINT "REL_7"
    FOREIGN KEY("empresa_cliente_empresa_id")
    REFERENCES "empresa_cliente"("empresa_id")
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION ;
ALTER TABLE "dado_extra_empresa_cliente"
    ADD CONSTRAINT "REL_4"
    FOREIGN KEY("empresa_cliente_empresa_id")
    REFERENCES "empresa_cliente"("empresa_id")
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION ;
ALTER TABLE "projeto"
    ADD CONSTRAINT "REL_10"
    FOREIGN KEY("empresa_cliente_empresa_id")
    REFERENCES "empresa_cliente"("empresa_id")
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION ;
ALTER TABLE "chamado"
    ADD CONSTRAINT "REL_14"
    FOREIGN KEY("empresa_cliente_empresa_id")
    REFERENCES "empresa_cliente"("empresa_id")
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION ;
ALTER TABLE "item_invetario_empresa_cliente"
    ADD CONSTRAINT "REL_22"
    FOREIGN KEY("empresa_cliente_empresa_id")
    REFERENCES "empresa_cliente"("empresa_id")
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION ;
ALTER TABLE "relacao_categoria_chamado"
    ADD CONSTRAINT "REL_21"
    FOREIGN KEY("equipamento_equipamento_id")
    REFERENCES "equipamento"("equipamento_id")
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION ;
ALTER TABLE "relacao_fun_admin"
    ADD CONSTRAINT "REL_8"
    FOREIGN KEY("funcionalidade_administrador_funcionalidade_id")
    REFERENCES "funcionalidade_administrador"("funcionalidade_id")
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION ;
ALTER TABLE "relacao_fun_user"
    ADD CONSTRAINT "REL_3"
    FOREIGN KEY("funcionalidade_usuario_funcionalidade_id")
    REFERENCES "funcionalidade_usuario"("funcionalidade_id");
ALTER TABLE "relacao_proce_item_inven"
    ADD CONSTRAINT "REL_23"
    FOREIGN KEY("item_inventario_empresa_cliente_item_id")
    REFERENCES "item_invetario_empresa_cliente"("item_id")
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION ;
ALTER TABLE "relacao_proce_item_inven"
    ADD CONSTRAINT "REL_24"
    FOREIGN KEY("procedimento_chamado_procedimento_id")
    REFERENCES "procedimento_chamado"("procedimento_id")
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION ;
ALTER TABLE "departamento"
    ADD CONSTRAINT "REL_11"
    FOREIGN KEY("projeto_empresa_cliente_empresa_id", "projeto_projeto_id")
    REFERENCES "projeto"("empresa_cliente_empresa_id", "projeto_id")
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION ;
ALTER TABLE "relacao_categoria_chamado"
    ADD CONSTRAINT "REL_18"
    FOREIGN KEY("projeto_projeto_id")
    REFERENCES "projeto"("projeto_id")
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION ;
ALTER TABLE "equipamento"
    ADD CONSTRAINT "REL_13"
    FOREIGN KEY("sala_sala_id", "sala_departamento_departamento_id", "sala_departamento_projeto_empresa_cliente_empresa_id", "sala_departamento_projeto_projeto_id")
    REFERENCES "sala"("sala_id", "departamento_departamento_id", "departamento_projeto_empresa_cliente_empresa_id", "departamento_projeto_projeto_id")
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION ;
ALTER TABLE "relacao_categoria_chamado"
    ADD CONSTRAINT "REL_20"
    FOREIGN KEY("sala_sala_id")
    REFERENCES "sala"("sala_id")
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION ;
ALTER TABLE "log_atividade_usuario"
    ADD CONSTRAINT "REL_6"
    FOREIGN KEY("usuario_usuario_id", "usuario_empresa_cliente_empresa_id")
    REFERENCES "usuario"("usuario_id", "empresa_cliente_empresa_id")
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION ;
ALTER TABLE "relacao_fun_user"
    ADD CONSTRAINT "REL_2"
    FOREIGN KEY("usuario_usuario_id")
    REFERENCES "usuario"("usuario_id")
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION ;
ALTER TABLE "dado_extra_usuario"
    ADD CONSTRAINT "REL_1"
    FOREIGN KEY("usuario_usuario_id")
    REFERENCES "usuario"("usuario_id")
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION ;
ALTER TABLE "chamado"
    ADD CONSTRAINT "REL_15"
    FOREIGN KEY("usuario_solicitante")
    REFERENCES "usuario"("usuario_id")
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION ;
ALTER TABLE "chamado"
    ADD CONSTRAINT "REL_16"
    FOREIGN KEY("usuario_responsavel")
    REFERENCES "usuario"("usuario_id")
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION ;


ALTER TABLE ONLY "administrador" ALTER COLUMN "uf" SET DEFAULT 'sc';
ALTER TABLE ONLY "empresa_cliente" ALTER COLUMN "uf" SET DEFAULT 'sc';
ALTER TABLE ONLY "usuario" ALTER COLUMN "uf" SET DEFAULT 'sc';
    
asked by anonymous 14.09.2014 / 20:54

1 answer

2

Your chamado table has the following primary key definition:

PRIMARY KEY("chamado_id","empresa_cliente_empresa_id","usuario_solicitante","usuario_responsavel")

And nothing else. This means that a call will only be considered "duplicate" if all these fields are the same. Example:

chamado_id    empresa_cliente_empresa_id    usuario_solicitante   usuario_responsavel
-------------------------------------------------------------------------------------
1             1                             1                     2
1             1                             1                     3
1             1                             2                     3
...

All of these would be valid records based on your primary key definition.

Now see how you create a foreign key for the chamado table:

REFERENCES "chamado"("chamado_id", "empresa_cliente_empresa_id")

Now, if there can be multiple fields with value chamado_id equal and empresa_cliente_empresa_id equal - since the rest is different - how to know which is being referenced? Only if the bank knows that a single line exists with this set of values, i.e. if they are subject to a unique constraint.

To resolve this problem, sufficient add a unique constraint to the called table containing these two columns. But most likely what you want is not this: review how you set the primary key of the chamado table, is it even possible to have multiple of these columns repeated? By the way, is it even possible to have two calls with the same chamado_id ? Set your primary key definition accordingly, and the problem will disappear alone (since a primary key also sets a unique constraint).

    
15.09.2014 / 11:20