Duvida Chave Composta 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