2008-08-08 17 views
13

J'ai une table qui est censée suivre les jours et les coûts pour l'expédition du produit d'un fournisseur à un autre. Nous (brillamment: p) stocké les deux fournisseurs d'expédition (FedEx, UPS) avec les vendeurs de manutention de produits (Think ... Dunder Mifflin) dans un tableau "VENDEUR". Donc, j'ai trois colonnes dans ma table SHIPPING_DETAILS qui font toutes référence à VENDOR.no. Pour une raison quelconque, MySQL ne me laisse pas définir tous les trois comme des clés étrangères. Des idées?Plusieurs clés étrangères?

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; 

modifié pour supprimer la définition double clé primaire ...


Oui, malheureusement, cela n'a pas résolu cependant. Maintenant, je reçois:

Ne peut pas créer la table './ DB MON NOM RETIRÉ /SHIPPING_GRID.frm' (errno: 150)

Faire un phpinfo() dit moi cela pour MySQL:

version API client 5.0.45

Oui, VENDOR.no est de type int (6).

+0

En effet, l'erreur? 150 fait référence à une erreur [foreign key constraints] (http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html). Pouvez-vous fournir la définition de la table VENDOR? Le PK du VENDEUR est-il un INT (6) ou juste un INT? De la page ci-dessus: - * La taille et le signe des types entiers doivent être identiques. * –

Répondre

8

Vous avez défini deux fois la clé primaire. Essayez:

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; 

La clé primaire VENDOR doit être INT (6) et les deux tables doivent être de type InnoDB.

0

J'ai exécuté le code ici, et le message d'erreur a montré (et c'est juste!) Que vous définissez le champ id deux fois comme clé primaire.

0

Pouvez-vous fournir la définition de la table VENDOR

I figured it out. La table Vendor était MyISAM ... (modifié votre réponse à me dire de les rendre à la fois InnoDB;))

(aucune raison pas à juste passer le type sur VENDOR InnoDB)

Questions connexes