我正在尝试运行5个create table语句。其中3个用我声明的外键正常工作,但表格'generalweather'和'userreg'正在抛出错误1005,我知道有做我的外键不匹配。我一直在寻找错误,但我无法在任何地方找到它。这两个create table语句有什么问题? (我的默认架构名为“tester”)
CREATE TABLE `coastal` (
`Date` varchar(50) NOT NULL,
`Time` varchar(50) NOT NULL DEFAULT '',
`AM/PM` varchar(45) NOT NULL,
`Location` varchar(50) NOT NULL DEFAULT '',
`Tide Description` varchar(50) DEFAULT NULL,
`Estimated Swell(ft)` int(11) DEFAULT NULL,
`Wind Speed(mph)` int(11) DEFAULT NULL,
`Wind Direction` varchar(45) DEFAULT NULL,
`Visibility (%)` varchar(50) DEFAULT NULL,
PRIMARY KEY (`Date`,`Time`,`Location`,`AM/PM`),
CONSTRAINT `coastalFK`
FOREIGN KEY (Date, Time, Location, `AM/PM`)
REFERENCES tester.locations (Date, Time, Location, `AM/PM`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
INDEX `DateFK_idx` (`Date` ASC) ,
INDEX `TimeFK_idx` (`Time` ASC) ,
INDEX `AM/PMFK_idx` (`AM/PM` ASC) ,
INDEX `LocationFK_idx` (`Location` ASC)
);
CREATE TABLE `generalweather` (
`Date` varchar(50) NOT NULL,
`Location` varchar(50) NOT NULL,
`ClimateDescription` varchar(50) NOT NULL DEFAULT '',
`Average Temperature(F)` int(11) DEFAULT NULL,
`Elevation(ft)` varchar(50) DEFAULT NULL,
`Recommended Activity` varchar(50) DEFAULT NULL,
PRIMARY KEY (`Date`,`Location`,`ClimateDescription`),
CONSTRAINT `generalweatherFK`
FOREIGN KEY (Date, Location)
REFERENCES tester.locations (Date, Location)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
INDEX `DateFK_idx` (`Date` ASC) ,
INDEX `LocationFK_idx` (`Location` ASC)
);
CREATE TABLE `locations` (
`Date` varchar(50) NOT NULL DEFAULT '',
`Time` varchar(50) NOT NULL DEFAULT '',
`AM/PM` varchar(45) NOT NULL,
`Location` varchar(50) NOT NULL DEFAULT '',
`Location Type` varchar(50) DEFAULT NULL,
`Temperature (F)` varchar(45) DEFAULT NULL,
PRIMARY KEY (`Date`,`Time`,`Location`,`AM/PM`)
);
CREATE TABLE `precipitation` (
`Date` varchar(50) NOT NULL,
`Time` varchar(50) NOT NULL DEFAULT '',
`AM/PM` varchar(45) NOT NULL,
`Location` varchar(50) NOT NULL DEFAULT '',
`Precipitation Chance (%)` text,
`Wind Speed(mph)` int(11) DEFAULT NULL,
`Wind Direction` varchar(50) DEFAULT NULL,
`Visibility (%)` varchar(50) DEFAULT NULL,
`Humidity (%)` varchar(50) DEFAULT NULL,
PRIMARY KEY (`Date`,`Time`,`AM/PM`,`Location`),
CONSTRAINT `DateFK`
FOREIGN KEY (Date, Time, Location, `AM/PM`)
REFERENCES tester.locations (Date, Time, Location, `AM/PM`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
INDEX `DateFK_idx` (`Date` ASC) ,
INDEX `TimeFK_idx` (`Time` ASC) ,
INDEX `AM/PMFK_idx` (`AM/PM` ASC) ,
INDEX `LocationFK_idx` (`Location` ASC)
);
CREATE TABLE `userreg` (
`User Name` varchar(50) NOT NULL DEFAULT '',
`Real Name` varchar(50) DEFAULT NULL,
`Email address` varchar(50) DEFAULT 'NONE ON FILE',
`Location` varchar(50) NOT NULL,
PRIMARY KEY (`User Name`),
CONSTRAINT `userregFK`
FOREIGN KEY (`Location`)
REFERENCES tester.locations (`Location`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
INDEX `LocationFK_idx` (`Location` ASC)
);
答案 0 :(得分:3)
有几个问题。您必须在引用它的任何其他表之前构建Locations
表。所以把它移到顶部。
然后,您需要为您定义的每个FOREIGN KEY
提供匹配的索引。你有一个<{1}}的复合
PRIMARY KEY
已经存在,因此您的一些PRIMARY KEY (`Date`,`Time`,`Location`,`AM/PM`)
定义将起作用。但是,您需要为那些不使用完整复合FOREIGN KEY
的FK定义创建其他索引。这是因为父和引用表都必须在您用作PK
的整个列集中定义索引。
FOREIGN KEY
以下是整个建筑的正确构建:http://sqlfiddle.com/#!2/d208e