Pergunta

Eu tenho uma tabela que deve rastrear dias e custos de envio de produtos de um fornecedor para outro.Nós (brilhantemente :p) armazenamos tanto os fornecedores de remessa (FedEx, UPS) quanto os fornecedores de manuseio de produtos (pense...Dunder Mifflin) em uma tabela "VENDOR".Portanto, tenho três colunas em minha tabela SHIPPING_DETAILS que fazem referência a VENDOR.no.Por alguma razão, o MySQL não me permite definir todos os três como chaves estrangeiras.Alguma ideia?

CREATE TABLE SHIPPING_GRID(  
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'Unique ID for each row',  
    shipping_vendor_no INT(6) NOT NULL COMMENT 'Foreign key to VENDOR.no for the shipping vendor (vendors_type must be 3)',  
    start_vendor_no INT(6) NOT NULL COMMENT 'Foreign key to VENDOR.no for the vendor being shipped from',  
    end_vendor_no INT(6) NOT NULL COMMENT 'Foreign key to the VENDOR.no for the vendor being shipped to',  
    shipment_duration INT(1) DEFAULT 1 COMMENT 'Duration in whole days shipment will take',  
    price FLOAT(5,5) NOT NULL COMMENT 'Price in US dollars per shipment lbs (down to 5 decimal places)',  
    is_flat_rate TINYINT(1) DEFAULT 0 COMMENT '1 if is flat rate regardless of weight, 0 if price is by lbs',  
    INDEX (shipping_vendor_no),  
    INDEX (start_vendor_no),  
    INDEX (end_vendor_no),  
    FOREIGN KEY (shipping_vendor_no) REFERENCES VENDOR (no),  
    FOREIGN KEY (start_vendor_no) REFERENCES VENDOR (no),  
    FOREIGN KEY (end_vendor_no) REFERENCES VENDOR (no)  
) TYPE = INNODB;

Editado para remover a definição de chave primária dupla...


Sim, infelizmente isso não resolveu o problema.Agora estou recebendo:

Não é possível criar tabela './REMOVI MEU NOME DE BD/Shipping_grid.frm '(errno:150)

Fazer um phpinfo() me diz isso para o mysql:

API do cliente versão 5.0.45

Sim, o VENDOR.no é do tipo int(6).

Foi útil?

Solução

Você definiu a chave primária duas vezes.Tentar:

CREATE TABLE SHIPPING_GRID(  
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'Unique ID for each row',  
    shipping_vendor_no INT(6) NOT NULL COMMENT 'Foreign key to VENDOR.no for the shipping vendor (vendors_type must be 3)',  
    start_vendor_no INT(6) NOT NULL COMMENT 'Foreign key to VENDOR.no for the vendor being shipped from',  
    end_vendor_no INT(6) NOT NULL COMMENT 'Foreign key to the VENDOR.no for the vendor being shipped to',  
    shipment_duration INT(1) DEFAULT 1 COMMENT 'Duration in whole days shipment will take',  
    price FLOAT(5,5) NOT NULL COMMENT 'Price in US dollars per shipment lbs (down to 5 decimal places)',  
    is_flat_rate TINYINT(1) DEFAULT 0 COMMENT '1 if is flat rate regardless of weight, 0 if price is by lbs',  
    INDEX (shipping_vendor_no),  
    INDEX (start_vendor_no),  
    INDEX (end_vendor_no),  
    FOREIGN KEY (shipping_vendor_no) REFERENCES VENDOR (no),  
    FOREIGN KEY (start_vendor_no) REFERENCES VENDOR (no),  
    FOREIGN KEY (end_vendor_no) REFERENCES VENDOR (no)  
) TYPE = INNODB;

A chave primária VENDOR deve ser INT(6) e ambas as tabelas devem ser do tipo InnoDB.

Outras dicas

Executei o código aqui e a mensagem de erro mostrou (e está certo!) que você está configurando eu ia campo duas vezes como chave primária.

Você pode fornecer a definição da tabela de fornecedores

Eu descobri.A tabela VENDOR era MyISAM...(editei sua resposta para me dizer para tornar os dois INNODB;))

(qualquer razão não apenas mudar o tipo VENDOR para INNODB?)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top