Problems with Constraints in Postgresql

Asked

Viewed 7,703 times

1

I’m going through a problem with Postgresql, 8.1.

When adding constraints it returns this error: SQL error:

ERROR: there is no Unique Constraint matching Given Keys for referenced table "called"

Follow 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';
  • 1

    Please inform us on which line the error happens.

  • Unfortunately phpPgAdmin does not return the line, only: ERROR: there is no Unique Constraint matching Given Keys for referenced table "called"

  • 2

    Fernando, try running query by query and check which point is returning this error.

  • 2

    Fernando, the error message itself should give a hint of where this error is, no? If she cites the table "called", then the problem can only be in something involving this table... It is not necessary (nor desirable) if you put the code whole in the question, because it only leaves people with "laziness" [justified] to read the whole code looking for the wrong part. I say this because you should get better and faster answers if "help us help you". :)

1 answer

3

Your table chamado has the following primary key definition:

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

And nothing else. It means that a call will only be considered "duplicated" if all these fields are equal. 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 according to their primary key definition.

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

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 - as long as the rest is different - how to know which of them is being referenced? Only if the bank knows it exists a single line with that set of values, i.e. if they are subject to a restriction unique.

To solve this problem, it is sufficient add a restriction unique to the table called containing these two columns. But most likely what you want is not this: review the way you define the table primary key chamado, is it even possible to have several of these repeated columns? Indeed, it is even possible to have two calls with the same chamado_id? Adjust your primary key definition accordingly, and the problem will disappear by itself (since a primary key also establishes a constraint unique).

  • I have this same problem. I added an id (serial), put as Unique and Primary key but keeps giving the same error :(

Browser other questions tagged

You are not signed in. Login or sign up in order to post.