Olá amigos…
Alguem poderir ensinar como criar uma chave composto formada por 2 foreign key ?
Olá amigos…
Alguem poderir ensinar como criar uma chave composto formada por 2 foreign key ?
CREATE TABLE tabela (
id INT NOT NULL,
id_fk1 NOT NULL,
id_fk2 NOT NULL,
campo1,
campo2,
CONSTRAINT pk_id PRIMARY KEY (id),
CONSTRAINT fk1_id FOREIGN KEY (id_fk1) REFERENCES tabela1 (id),
CONSTRAINT fk2_id FOREIGN KEY (id_fk2) REFERENCES tabela2 (id),
);
ONDE:
fk1_id e fk2_id - são os nomes das chaves estrangeiras (dependendo do banco de dados, não existe a necessidade);
id_fk1 e id_fk2 - são os campos presentes nesta tabela que serão utilizados como chave estrangeira;
tabela1 (id) / tabela2 (id) - são os ponteiros que identificam a conexão com as chaves primárias das tabelas externas.
Espero ter ajudado.
CREATE TABLE nome_da_tabela (
fk1 integer,
fk2 integer,
constraint chave_primaria_composta primary key (fk1, fk2),
constraint chave_estrangeira1 foreign key (fk1) references (nome_da_tabela_de_referencia1),
constraint chave_estrangeira2 foreign key (fk2) references (nome_da_tabela_de_referencia2)
)
Dessa forma você tem as duas chaves estrangeiras e a chave primária é a combinação do valor das duas (uma chave composta)…
Valeu… vou testar
tentei executar no MySql, acertando o nome das colunas e tabelas, e deu erro:
ERROR 1064 (42000)
O codigo ddl que eu digitei foi esse :
CREATE TABLE nome_da_tabela (
idProduto integer,
idFornecedor integer,
constraint chave_primaria_composta primary key (idProduto, idFornecedor),
constraint chave_estrangeira1 foreign key (idProduto) references (produto),
constraint chave_estrangeira2 foreign key (idFornecedor) references (fornecedor)
)
CREATE TABLE nome_da_tabela (
idProduto integer,
idFornecedor integer,
constraint chave_primaria_composta primary key (idProduto, idFornecedor),
constraint chave_estrangeira1 foreign key (idProduto) references tabela_produto(campo_produto),
constraint chave_estrangeira2 foreign key (idFornecedor) references tabela_fornecedor(campo_fornecedor)
)
Tente assim…
[quote=bob_sponja]
CREATE TABLE nome_da_tabela (
fk1 integer,
fk2 integer,
constraint chave_primaria_composta primary key (fk1, fk2),
constraint chave_estrangeira1 foreign key (fk1) references (nome_da_tabela_de_referencia1),
constraint chave_estrangeira2 foreign key (fk2) references (nome_da_tabela_de_referencia2)
)
Dessa forma você tem as duas chaves estrangeiras e a chave primária é a combinação do valor das duas (uma chave composta)…[/quote]
Carai!!! Dei uma de cabaço e informei o código errado =P… onde está “references (nome_da_tabela_de_referencia)” deve ser assim “references nome_da_tabela_de_referencia (nome_do_campo_de_referencia)”…
Desculpa pelo engano =)
Obridado Bruno…
mas agora ta dando erro
ERROR 1005: Cant create table ‘lm.tabelacusto’ (errno:150)
CREATE TABLE tabelacusto (
idProduto integer,
idFornecedor integer,
constraint chave_primaria_composta primary key (idProduto, idFornecedor),
constraint chave_estrangeira1 foreign key (idProduto) references produto(idProduto),
constraint chave_estrangeira2 foreign key (idFornecedor) references fornecedor(idFornecedor)
) ;
[quote=douglasmorais]Obridado Bruno…
mas agora ta dando erro
ERROR 1005: Cant create table ‘lm.tabelacusto’ (errno:150)
CREATE TABLE tabelacusto (
idProduto integer,
idFornecedor integer,
constraint chave_primaria_composta primary key (idProduto, idFornecedor),
constraint chave_estrangeira1 foreign key (idProduto) references produto(idProduto),
constraint chave_estrangeira2 foreign key (idFornecedor) references fornecedor(idFornecedor)
) ;
[/quote]
Cara, eu mexi pouco com o MySQL, mas acho que pra declarar a PRIMARY KEY dele não é como eu tinha dito… Tenta o código abaixo:
CREATE TABLE tabelacusto (
idProduto integer,
idFornecedor integer,
primary key (idProduto, idFornecedor),
constraint chave_estrangeira1 foreign key (idProduto) references produto(idProduto),
constraint chave_estrangeira2 foreign key (idFornecedor) references fornecedor(idFornecedor)
) ;
Valeu BOB…
Mas continua dantdo o mesmo erro…
Será que tem haver com o fato das tabelas Fornecedor e Produto nao estarem definidas como INNODB ?
Vou recria-las como do tipo INNODB pra testar.
CREATE TABLE tabelacusto (
idProduto integer not null,
idFornecedor integer not null,
constraint chave_primaria_composta primary key (idProduto, idFornecedor),
constraint chave_estrangeira1 foreign key (idProduto) references produto(idProduto),
constraint chave_estrangeira2 foreign key (idFornecedor) references fornecedor(idFornecedor)
) ;
Chaves primárias tem de ser NAO NULAS.
Com relação aos campos idProduto, na tabela Produto e idFornecedor, na tabela Fornecedor. Estes campos tem de ser do tipo INTEGER.
Qual o sentido de criar os campos idProduto e idForneedor, na tabela TABELA_CUSTO como chaves primárias?
Sendo chaves estrangeiras não nulas, já são obrigatórias e fazem referencia as suas respectivas tabelas.
Não existe necessidade de criar estes dois campos como chaves primarias.
Ao meu ver, este seria o script correto:
CREATE TABLE tabela_custo (
idProduto integer not null,
idFornecedor integer not null,
constraint chave_estrangeira1 foreign key (idProduto) references produto(idProduto),
constraint chave_estrangeira2 foreign key (idFornecedor) references fornecedor(idFornecedor)
) ;
[quote=douglasmorais]Será que tem haver com o fato das tabelas Fornecedor e Produto nao estarem definidas como INNODB ?
Vou recria-las como do tipo INNODB pra testar.[/quote]
Realmente você está correto, Douglas… A engine do MySQL que permitiu o mecanismo de FOREIGN KEY é a InnoDB, pois a MyISAM não tinha suporte a esse tipo de constraint…
Bruno, refiz seguindo sua ultima sugestao mas o erro persiste. As PK de Produto e Fornecedor foram criadas como INTEGER Not Null.
Douglas,
Segue abaixo um exemplo de uma base contendo chave estrangeira composta.
Este modelo foi implementado no SQL Server 2008 e funcionou corretamente.
CREATE DATABASE BrazilAirlines;
CREATE TABLE Flight (
FlightNO INT NOT NULL,
Date DATETIME NOT NULL,
Source NVARCHAR(200) NOT NULL,
Destination NVARCHAR(200) NOT NULL,
AvailableSits INT NOT NULL,
SitsSold INT,
CONSTRAINT PK_Flight PRIMARY KEY (FlightNO)
);
CREATE TABLE Customer (
CustomerName NVARCHAR(300) NOT NULL,
Address NVARCHAR(500) NOT NULL,
CONSTRAINT PK_Customer PRIMARY KEY (CustomerName)
);
CREATE TABLE FlightCustomer (
FlightNO INT NOT NULL,
CustomerName NVARCHAR(300) NOT NULL,
Date DATETIME NOT NULL,
CONSTRAINT FK_FlightCustomer_Flight FOREIGN KEY (FlightNO) REFERENCES Flight(FlightNO),
CONSTRAINT FK_FlightCustomer_Customer FOREIGN KEY (CustomerName) REFERENCES Customer(CustomerName)
);
BLZ… vou tentar