Foreign Key no IBExpert gera esse erro

Delphi

Modelagem

Firebird

30/09/2014

Cedro do Abaeté, 30 de Setembro de 2014 - 10:07

Bom dia!

Estou usando uma versão que acredito ser gratuita do IBExpert - Version 2014.6.17.1 - não tenho nenhuma experiência com o que estou fazendo - ESTOU APRENDENDO.
Criei uma Tabela - Alunos
Codigo Integer Chave Primária
Nome varchar(50) Chave única
Sexo char(1)
. . . . .

Criei um Tabela - Sexos
Codigo Integer Chave Primária
Sexo char(9) Chave única
Abreviatura char(1) chave única

Estou tentando criar uma foreign key usando o campo Sexo da Tabela de Alunos e Abreviatura da Tabela Sexos. Usando a IDE ou o SQL Editor, quando mando executar o comando aparece a mensagem abaixo:

Esta operação não está definida para tabelas do sistema. Atualização de metadados sem êxito.

Isso é problema de versão do IBExpert ou o problema está entre a cadeira e o teclado? Abaixo o código da foreign:

ALTER TABLE ALUNOS ADD CONSTRAINT FK_ALUNOS_1 FOREIGN KEY (SEXO) REFERENCES SEXOS(ABREVIATURA)

Tomara que esteja entre a cadeira e o teclado, assim fica fácil de Eu resolver!

Ficarei extremamente grato a quem puder Me ajudar.

Franklin de Sousa
Franklin Mei

Franklin Mei

Curtidas 0

Respostas

Eduardo Silva.

Eduardo Silva.

30/09/2014

CREATE TABLE ALUNOS (
ID_ALUNO INTEGER NOT NULL,
ALUNO VARCHAR(50) CHARACTER SET WIN1252 COLLATE WIN_PTBR,
ID_SEXO INTEGER NOT NULL);


CREATE TABLE SEXO (
ID_SEXO INTEGER NOT NULL,
SEXO VARCHAR(10) CHARACTER SET WIN1252 COLLATE WIN_PTBR);

ALTER TABLE ALUNOS ADD CONSTRAINT PK_ALUNOS PRIMARY KEY (ID_ALUNO);
ALTER TABLE SEXO ADD CONSTRAINT PK_SEXO PRIMARY KEY (ID_SEXO);

ALTER TABLE ALUNOS ADD CONSTRAINT FK_ALUNOS_SEXO FOREIGN KEY (ID_SEXO) REFERENCES SEXO (ID_SEXO);

abs

Eduardo Belo
GOSTEI 0
Franklin Mei

Franklin Mei

30/09/2014

Cedro do Abaeté, 30 de Setembro de 2014 - 19:18

Boa Noite!

Eduardo como disse "
GOSTEI 0
Franklin Mei

Franklin Mei

30/09/2014

Cedro do Abaeté, 30 de Setembro de 2014 - 19:19

Boa Noite!

Eduardo como Eu disse e ia dizendo novamente a um minuto "SOU MARINHEIRO DE PRIMEIRÍSSIMA VIAGEM". Deixa Eu tentar traduzir o que Você Me enviou e se estiver muito errado, agradeceria se pudesse ser mais claro se é que isso é possível.

ALTER TABLE ALUNOS ADD CONSTRAINT FK_ALUNOS_SEXO FOREIGN KEY (ID_SEXO) REFERENCES SEXO (ID_SEXO);

Altere a tabela Alunos adicionando uma chave estrangeira com o nome FK_ALUNOS_SEXO sendo a chave estrangeira o campo ID_SEXO que tem como referência a tabela Sexo campo ID_SEXO.

Eduardo é preciso que o campo que será a referência seja uma chave primária?

Muito obrigado a todos por enquanto,

Franklin de Sousa
GOSTEI 0
Eduardo Silva.

Eduardo Silva.

30/09/2014

Cedro do Abaeté, 30 de Setembro de 2014 - 19:19

Boa Noite!

Eduardo como Eu disse e ia dizendo novamente a um minuto "SOU MARINHEIRO DE PRIMEIRÍSSIMA VIAGEM". Deixa Eu tentar traduzir o que Você Me enviou e se estiver muito errado, agradeceria se pudesse ser mais claro se é que isso é possível.

ALTER TABLE ALUNOS ADD CONSTRAINT FK_ALUNOS_SEXO FOREIGN KEY (ID_SEXO) REFERENCES SEXO (ID_SEXO);

Altere a tabela Alunos adicionando uma chave estrangeira com o nome FK_ALUNOS_SEXO sendo a chave estrangeira o campo ID_SEXO que tem como referência a tabela Sexo campo ID_SEXO.

Eduardo é preciso que o campo que será a referência seja uma chave primária?

Muito obrigado a todos por enquanto,

Franklin de Sousa


Sim, é preciso. Recomendo a você estudar algo sobre Modelagem de Banco de Dados Relacional, leia a parte de [url:descricao=Chave Primária]http://pt.wikipedia.org/wiki/Chave_prim%C3%A1ria[/url] e Chave Estrangeira.

Se você quer utilizar a abreviatura "M" = Masculino e "F" Feminino, altere os campos ID_SEXO das duas Tabelas de tipo Integer para Char no exemplo que lhe envie. Não é necessário na tabela SEXOS você ter o campo CÓDIGO como chave primaria, pois a chave primaria vai ser ID_SEXO ou outro nome que você queira dar. Procure estudar também algo sobre os tipos de campos como CHAR e VARCHAR.

abs

Eduardo Belo
GOSTEI 0
Franklin Mei

Franklin Mei

30/09/2014

Cedro do Abaeté, 30 de Setembro de 2014 - 21:17

Boa noite!

Obrigado pela atenção Eduardo. No início mostrei como foram criadas as tabelas:

Criei uma Tabela - Alunos
Codigo Integer Chave Primária
Nome varchar(50) Chave única
Sexo char(1) not null
. . . . .

Criei um Tabela - Sexos
Codigo Integer Chave Primária
Sexo char(9) Chave única------------Aqui Eu imagino saber o tamanho máximo da string(9) - Masculino
Abreviatura char(1) chave única

Sexo lá com abreviatura aqui (char(1))

Sou Marinheiro, mas pelo que já vi aqui na Internet essa chave estrangeira não precisa de nenhuma referência para ser criada. É isso que não estou conseguindo entender.

Eduardo todas as Tabelas do Banco de Dados têm um campo Codigo que é a CHAVE PRIMÁRIA. Não sei ainda, mas acredito que um dia vou fazer uso disso, pois penso que se Eu colocar agora o Nome como Chave Primária na Tabela Alunos pode aparecer um homônimo no futuro e aí tenho que ficar inventando coisa o que acho não ser legal.
Será que pode ser por causa de algo desativado no IBExpert ou por ser Gratuito?

Obrigado por enquanto,

Franklin de Sousa
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

30/09/2014

Olá, Franklin.
Para criar um relacionamento, as duas colunas envolvidas devem se do mesmo tipo. Como você mesmo observou, suas colunas têm tipos diferentes.
Lhe aconselho a remover a coluna Código da tabela de sexos, pois não é necessária, e tornar a coluna Abreviatura como chave primária, passando a utilizá-la no relacionamento.

E indo além, lhe digo que a tabela de sexos não é necessária no seu sistema, uma vez que provavelmente só haverá duas opções (Masculino ou Feminino) ,ou no máximo três (Indefinido, que acho que não cabe no seu sistema). Basta ter o campo Sexo na tabela de Alunos.
GOSTEI 0
Franklin Mei

Franklin Mei

30/09/2014

Cedro do Abaeté, 01 de Outubro de 2014 - 21:01

Boa noite!

Joel muito obrigado pela atenção.
Vamos fazer uma revisão rápida:
Campo Sexo na Tabela de Alunos é char(1) not null
Campo Abreviatura na Tabela de Sexos é char(1) chave única, portanto os campos são do mesmo tipo.

Como informei aqui, estou aprendendo agora, mas penso que se tenho que suprimir um campo de uma tabela para que outro que faça o processo, acredito que tenha uma falha em algum lugar.


This operation is not defined for system tables.
unsuccessful metadata update.
@1.

Esta operação não está definida para tabelas do sistema. Atualização de metadados sem êxito.

Fiz o que Você aconselhou e aconteceu a mesma coisa. Será que essa parada não é por causa da versão do IBExpert que estou usando!

Mas por favor, estou realmente precisando de ajuda.

Atenciosamente,

Franklin de Sousa
GOSTEI 0
POSTAR