2011-08-11 184 views
0

我的数据库有一个结构问题。mysql数据库中的结构问题

我想知道为什么MYSQL生成以下错误:

#1005 - Can't create table 'test.panier' (errno: 150) 变量的名称并不重要..其唯一的结构

这是我的SQL文件。

DROP TABLE IF EXISTS Panier; 
DROP TABLE IF EXISTS Materiel; 
DROP TABLE IF EXISTS Medicament; 
DROP TABLE IF EXISTS Produit; 
DROP TABLE IF EXISTS ListePatient; 
DROP TABLE IF EXISTS Patient; 
DROP TABLE IF EXISTS Specialiste; 
DROP TABLE IF EXISTS TelPers; 
DROP TABLE IF EXISTS Personne; 
DROP TABLE IF EXISTS Telephone; 
DROP TABLE IF EXISTS Adresse; 

CREATE TABLE Panier(
idPanier  INT(5) NOT NULL, 
idProduit  INT(100) NOT NULL, 
PRIMARY KEY (`idPanier`,`idProduit`), 
FOREIGN KEY(idPanier) REFERENCES Specialiste(idPanier), 
FOREIGN KEY(idProduit) REFERENCES Produit(idProduit) 
)ENGINE=InnoDB; 

CREATE TABLE Adresse(
idAdresse INT(100) NOT NULL PRIMARY KEY AUTO_INCREMENT, 
num   INT(5) NOT NULL, 
rue   VARCHAR(30) NOT NULL, 
ville   VARCHAR(15) NOT NULL, 
postal  VARCHAR(6) NOT NULL 
)ENGINE=InnoDB; 

CREATE TABLE Telephone(
idTel   INT(100) NOT NULL PRIMARY KEY AUTO_INCREMENT, 
typeTel  VARCHAR(15) NOT NULL, 
ind   INT(3) NOT NULL, 
quartier  INT(3) NOT NULL, 
num   INT(4) NOT NULL 
)ENGINE=InnoDB; 

CREATE TABLE Personne(
idPersonne  INT(100) PRIMARY KEY NOT NULL AUTO_INCREMENT, 
nom    VARCHAR(15) NOT NULL, 
prenom   VARCHAR(15) NOT NULL, 
idTel    INT(100) NOT NULL, 
idAdresse  INT(100) NOT NULL, 
FOREIGN KEY(idAdresse) REFERENCES Adresse(idAdresse), 
FOREIGN KEY(idTel) REFERENCES Telephone(idTel) 
)ENGINE=InnoDB; 

CREATE TABLE TelPers(
idPersonne  INT(100) NOT NULL, 
idTel    INT(100) NOT NULL, 
PRIMARY KEY (`idPersonne`,`idTel`), 
FOREIGN KEY(idPersonne) REFERENCES Personne(idPersonne), 
FOREIGN KEY(idTel) REFERENCES Telephone(idTel) 
)ENGINE=InnoDB; 

CREATE TABLE Specialiste(
login   VARCHAR(10) PRIMARY KEY NOT NULL, 
password VARCHAR(10) NOT NULL, 
profession VARCHAR(20) NOT NULL, 
idListeP  INT(5) NOT NULL, 
idPanier  INT(5), 
idPersonne INT(100), 
FOREIGN KEY(idPersonne) REFERENCES Personne(idPersonne) 
)ENGINE=InnoDB; 

CREATE TABLE Patient(
idPatient INT(10) NOT NULL PRIMARY KEY AUTO_INCREMENT, 
sexe   CHAR NOT NULL, 
anniv   DATE, 
assurance INT(3) NOT NULL, 
idPersonne INT(100), 
FOREIGN KEY(idPersonne) REFERENCES Personne(idPersonne) 
)ENGINE=InnoDB; 

CREATE TABLE Produit(
idProduit  INT(100) NOT NULL PRIMARY KEY AUTO_INCREMENT, 
nom   VARCHAR(50) NOT NULL, 
descr   VARCHAR(255) NOT NULL, 
prix   DECIMAL(5,2) NOT NULL, 
qte   INT(100) NOT NULL 
)ENGINE=InnoDB; 

CREATE TABLE Medicament(
idMedic   INT(100)NOT NULL PRIMARY KEY AUTO_INCREMENT, 
marque  VARCHAR(10) NOT NULL, 
typeMed  VARCHAR(10) NOT NULL, 
idProduit  INT(100) NOT NULL, 
FOREIGN KEY(idProduit) REFERENCES Produit(idProduit) 
)ENGINE=InnoDB; 

CREATE TABLE Materiel(
idMateriel INT(100) NOT NULL PRIMARY KEY AUTO_INCREMENT, 
rabais  INT(99) NOT NULL,               /* SI PRODUIT VENANT AVEC PRESCRIPTION */ 
idProduit  INT(100) NOT NULL, 
FOREIGN KEY(idProduit) REFERENCES Produit(idProduit) 
)ENGINE=InnoDB; 

感谢您的帮助。 :d

回答

1

你缺少在Specialiste表idPanier列

要创建 “帕尼埃” 引用表中的两列 1 Specialiste指数(idPanier) 2. Produit(idProduit)

idProduit被索引,因为它是一个主键

您将需要在Specialiste表为idPanier列中添加索引以及

而且由于帕尼埃表引用其他两个表......这些表应首先创建

更新的脚本如下:

DROP TABLE IF EXISTS Panier; 
DROP TABLE IF EXISTS Materiel; 
DROP TABLE IF EXISTS Medicament; 
DROP TABLE IF EXISTS Produit; 
DROP TABLE IF EXISTS ListePatient; 
DROP TABLE IF EXISTS Patient; 
DROP TABLE IF EXISTS Specialiste; 
DROP TABLE IF EXISTS TelPers; 
DROP TABLE IF EXISTS Personne; 
DROP TABLE IF EXISTS Telephone; 
DROP TABLE IF EXISTS Adresse; 


CREATE TABLE Adresse(
idAdresse INT(100) NOT NULL PRIMARY KEY AUTO_INCREMENT, 
num   INT(5) NOT NULL, 
rue   VARCHAR(30) NOT NULL, 
ville   VARCHAR(15) NOT NULL, 
postal  VARCHAR(6) NOT NULL 
)ENGINE=InnoDB; 

CREATE TABLE Telephone(
idTel   INT(100) NOT NULL PRIMARY KEY AUTO_INCREMENT, 
typeTel  VARCHAR(15) NOT NULL, 
ind   INT(3) NOT NULL, 
quartier  INT(3) NOT NULL, 
num   INT(4) NOT NULL 
)ENGINE=InnoDB; 

CREATE TABLE Personne(
idPersonne  INT(100) PRIMARY KEY NOT NULL AUTO_INCREMENT, 
nom    VARCHAR(15) NOT NULL, 
prenom   VARCHAR(15) NOT NULL, 
idTel    INT(100) NOT NULL, 
idAdresse  INT(100) NOT NULL, 
FOREIGN KEY(idAdresse) REFERENCES Adresse(idAdresse), 
FOREIGN KEY(idTel) REFERENCES Telephone(idTel) 
)ENGINE=InnoDB; 

CREATE TABLE TelPers(
idPersonne  INT(100) NOT NULL, 
idTel    INT(100) NOT NULL, 
PRIMARY KEY (`idPersonne`,`idTel`), 
FOREIGN KEY(idPersonne) REFERENCES Personne(idPersonne), 
FOREIGN KEY(idTel) REFERENCES Telephone(idTel) 
)ENGINE=InnoDB; 

CREATE TABLE Specialiste(
login   VARCHAR(10) PRIMARY KEY NOT NULL, 
password VARCHAR(10) NOT NULL, 
profession VARCHAR(20) NOT NULL, 
idListeP  INT(5) NOT NULL, 
idPersonne INT(100), 
idPanier  INT(5), 
INDEX(idPanier), 
FOREIGN KEY(idPersonne) REFERENCES Personne(idPersonne) 
)ENGINE=InnoDB; 


CREATE TABLE Patient(
idPatient INT(10) NOT NULL PRIMARY KEY AUTO_INCREMENT, 
sexe   CHAR NOT NULL, 
anniv   DATE, 
assurance INT(3) NOT NULL, 
idPersonne INT(100), 
FOREIGN KEY(idPersonne) REFERENCES Personne(idPersonne) 
)ENGINE=InnoDB; 

CREATE TABLE Produit(
idProduit  INT(100) NOT NULL PRIMARY KEY AUTO_INCREMENT, 
nom   VARCHAR(50) NOT NULL, 
descr   VARCHAR(255) NOT NULL, 
prix   DECIMAL(5,2) NOT NULL, 
qte   INT(100) NOT NULL 
)ENGINE=InnoDB; 

CREATE TABLE Medicament(
idMedic   INT(100)NOT NULL PRIMARY KEY AUTO_INCREMENT, 
marque  VARCHAR(10) NOT NULL, 
typeMed  VARCHAR(10) NOT NULL, 
idProduit  INT(100) NOT NULL, 
FOREIGN KEY(idProduit) REFERENCES Produit(idProduit) 
)ENGINE=InnoDB; 

CREATE TABLE Materiel(
idMateriel INT(100) NOT NULL PRIMARY KEY AUTO_INCREMENT, 
rabais  INT(99) NOT NULL,               /* SI PRODUIT VENANT AVEC PRESCRIPTION */ 
idProduit  INT(100) NOT NULL, 
FOREIGN KEY(idProduit) REFERENCES Produit(idProduit) 
)ENGINE=InnoDB; 

CREATE TABLE Panier(
idPanier  INT(5) NOT NULL, 
idProduit  INT(100) NOT NULL, 
FOREIGN KEY(idPanier) REFERENCES Specialiste(idPanier), 
FOREIGN KEY(idProduit) REFERENCES Produit(idProduit), 
PRIMARY KEY (`idPanier`,`idProduit`) 
)ENGINE=InnoDB; 
+0

看看Specialist表中的INDEX(idPanier)行 – jsshah

0

the MySQL docs

If you re-create a table that was dropped, it must have a definition that conforms to the foreign key constraints referencing it. It must have the right column names and types, and it must have indexes on the referenced keys, as stated earlier. If these are not satisfied, MySQL returns error number 1005 and refers to error 150 in the error message.

+0

那么....我做错了什么? – Hulk