Ir ao conteúdo
  • Cadastre-se
Ferreira27

restriçao de chave estrangeira

Recommended Posts

estou tendo dificuldade em achar o erro nesta tabela.

alguém pode me dar uma luz

Como referenciar a tabela cidade na tabela endereço

CONSTRAINT fk_endereco_nome_cidade FOREIGN KEY(nome_cidade) REFERENCES cidade(nome_cidade)

CREATE TABLE Uf (
id_uf serial,
sigla_uf CHAR(2) NOT NULL,
nome_uf VARCHAR(20) NOT NULL,
CONSTRAINT pk_uf PRIMARY KEY(sigla_uf)
);

select * from uf


CREATE TABLE cidade (
id_cidade serial,
cod_Ibge INTEGER NOT NULL,
nome_cidade VARCHAR(30) NOT NULL,
sigla_uf CHAR(2) NOT NULL,
CONSTRAINT pk_cidade PRIMARY KEY(cod_Ibge),
CONSTRAINT fk_cidade_uf FOREIGN KEY(sigla_uf) REFERENCES uf(sigla_uf)
);

CREATE TABLE endereco (
idEndereco INTEGER NOT NULL,
cep CHAR ( 8 ) NOT NULL,
logradouro VARCHAR ( 40 ) NOT NULL,
bairro VARCHAR ( 30 ) NOT NULL,
complemento VARCHAR ( 30 ),
cidade VARCHAR ( 30 ) NOT NULL,
sigla_uf CHAR ( 2 ) NOT NULL,
CONSTRAINT PK_endereco PRIMARY KEY (idEndereco),
CONSTRAINT fk_endereco_uf FOREIGN KEY(sigla_uf) REFERENCES uf(sigla_uf),
CONSTRAINT fk_endereco_nome_cidade FOREIGN KEY(nome_cidade) REFERENCES cidade(nome_cidade)

);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Do modo que você postou não deu certo

fiz assim nao sei se tá certo mas rodou

CONSTRAINT fk_endereco FOREIGN KEY(cidade) REFERENCES uf(sigla_uf)


CREATE TABLE endereco (
idEndereco serial,
cep CHAR ( 8 ) NOT NULL,
logradouro VARCHAR ( 40 ) NOT NULL,
bairro VARCHAR ( 30 ) NOT NULL,
complemento VARCHAR ( 30 ),
cidade VARCHAR ( 30 ) NOT NULL,
sigla_uf CHAR ( 2 ) NOT NULL,
CONSTRAINT PK_endereco PRIMARY KEY (idEndereco),
CONSTRAINT fk_endereco_uf FOREIGN KEY(sigla_uf) REFERENCES uf(sigla_uf),
CONSTRAINT fk_endereco FOREIGN KEY(cidade) REFERENCES uf(sigla_uf)

);

Compartilhar este post


Link para o post
Compartilhar em outros sites

O Correto é usar o Alter table, pois chaves se tratam da estrutura da tabela.

Alter table tabela add CONSTRAINT bla bla bla

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Ferreira, se a estrutura de suas tabelas é como você colocou na primeira mensagem, você errou e está fazendo errado de novo

você está referenciando o campo CIDADE da tabela ENDEREÇO, com o campo SIGLA DO ESTADO da tabela UF, não tem lógica alguma isso.

a resposta do Fernando está certa, qual foi o erro gerado?

@xChiron, ele fazer ALTER TABLE adicionando a restrição, ou já fazer tudo isso no CREATE TABLE como está fazendo, não é a mesma coisa?

---------------------------

EDIT

---------------------------

Não está dando certo a resposta do Fernando

pois a tabela CIDADE não tem um índice para o campo nome_cidade

crie a tabela cidade do jeito que você criou

execute isso: CREATE INDEX idx_cidade ON cidade(nome_cidade);

depois crie a tabela ENDERECO com a alteração postada pelo FERNANDO.

Caso não dê certo só falar, aqui funcionou perfeitamente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

amigo diz assim e ainda ta dando erro: coluna "cidade" referenciada na restrição de chave estrangeira não existe

Alter table cidade add CONSTRAINT fk_endereco_nome_cidade

FOREIGN KEY(cidade) REFERENCES

cidade(nome_cidade)

o que eu quero dizer é: o endereço pertence a qual cidade

Compartilhar este post


Link para o post
Compartilhar em outros sites

Rapaz, você tá fazendo um rolo só ^^

Chave estrangeira funciona assim (veja este exemplo):

Tenho uma tabela de CEP, nesta tabela, além da informação do CEP, possui informações como o nome da rua, a cidade, o estado, etc...

Tenho também, uma tabela de Cliente, e ao invés de criar campo para informar o nome da cidade do cliente, o nome da rua, etc... eu só crio o campo CEP (CEP_CLI se chamará) ok?

Aí, para a tabela CLIENTE, vou criar uma chave estrangeira para o campo CEP_CLI, para isso, o que preciso?

1 - O tipo do campo ser igual nas duas tabelas

2 - A tabela CEP, ter um índice para o campo CEP

Como ficaria a sintaxe para adicionar essa FK?

ALTER TABLE CLIENTE ADD CONSTRAINT fk_sei_la FOREIGN KEY CEP_CLI REFERENCES CEP(CEP);

Pro seu problema ser resolvido, você precisa criar o índice, e depois fazer a chave estrangeira de forma correta:

Bom, chega de mi mi mi, o que você precisa é isso

CREATE INDEX idx_cidade_nome_cidade ON cidade(nome_cidade);

ALTER TABLE endereco ADD CONSTRAINT fk_sei_la FOREIGN KEY (cidade) REFERENCES cidade(nome_cidade);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×