mysql - MySQL 抛出 1005 错误

标签 mysql sql database

我正在尝试运行 5 个创建表语句。其中 3 个使用我声明的外键工作正常,但是表 'generalweather''userreg' 抛出错误 1005,我知道必须处理我的外键中的一些不匹配。我一直在寻找错误,但我无法在任何地方找到它。这两个创建表语句有什么问题? (我的默认模式标题为“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)
);

最佳答案

有几个问题。您必须在引用它的任何其他表之前构建 Locations 表。所以将那个移到顶部。

然后,您需要为您定义的每个 FOREIGN KEY 匹配索引。你有一个复合 PRIMARY KEY

PRIMARY KEY (`Date`,`Time`,`Location`,`AM/PM`)

已经,所以您的一些 FOREIGN KEY 定义将起作用。但是,您将需要为那些不使用完整复合 PK 的 FK 定义创建额外的索引。这是因为父表和引用表都必须在您用作 FOREIGN KEY 的完整列集中定义一个索引。

# Move this table definition to be first
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`),

  # Added these two keys for the later FK definitions
  # Referenced by generalweatherFK:
  INDEX (`Date`, `Location`),
  # Referenced by userregFK
  INDEX (`Location`)
);

这是正确构建的全部内容:http://sqlfiddle.com/#!2/d208e

关于mysql - MySQL 抛出 1005 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16090267/

相关文章:

MySQL:从格式异常的 XML 文件中提取数据

mysql - 为组选择最小列总和

mysql - 父子表sql问题

PHP/MySQL 从同一表中选择范围的前一天和后一天

我的 SELECT DISTINCT 查询出现 Mysql 错误

php - SQL 更新不工作

mysql - SELECT 和 JOIN 受限

mysql - Rails 3 - ActiveRecord 和反向排序

database - 如何在 flutter 中从插入到 sqflite 数据库中返回 id

mysql - 按 drive_md5、db_id 清除偏移 > 10 组的行