当前位置: 首页 > 知识库问答 >
问题:

即使设置foreign_key_checks=0,也无法创建表(错误1215);

公英哲
2023-03-14

我尝试做的事情已经做了无数次,但现在从MySQL5.6.26升级到5.6.27失败了(在5.7.x中也失败了)。我有一个数据库,其中包含一堆带有外键约束的表。我导出了(使用phpMyAdmin)替换表,指定了以下导出选项:

Disable foreign key checks
Add DROP TABLE / VIEW / PROCEDURE / FUNCTION / EVENT / TRIGGER statement
Add CREATE TABLE statement

结果导出文件包含以下部分:

SET FOREIGN_KEY_CHECKS=0;

DROP TABLE IF EXISTS `application`;
CREATE TABLE `application` (
  `PK_Application` int(11) NOT NULL,
  `FK_Parent` int(11) DEFAULT NULL,
  `ApplicationLevel` tinyint(4) NOT NULL,
  `Description` varchar(35) NOT NULL,
  `Sequence` tinyint(4) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=latin1;

. . .
. . .

DROP TABLE IF EXISTS `product_x_application`;
CREATE TABLE `product_x_application` (
  `PK_Product_X_Application` int(11) NOT NULL,
  `Product_PKID` varchar(36) NOT NULL,
  `FK_Application` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

. . .
. . .

ALTER TABLE `product_x_application`
  ADD CONSTRAINT `product_x_application_ibfk_2` FOREIGN KEY (`FK_Application`) REFERENCES `application` (`PK_Application`) ON DELETE CASCADE ON UPDATE CASCADE;
-- phpMyAdmin SQL Dump
-- version 4.4.15
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: Jan 10, 2016 at 07:01 AM
-- Server version: 5.6.26-log
-- PHP Version: 5.6.12

SET FOREIGN_KEY_CHECKS=0;
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;

--
-- Database: `spmorell_sami`
--

-- --------------------------------------------------------

--
-- Table structure for table `application`
--

DROP TABLE IF EXISTS `application`;
CREATE TABLE `application` (
  `PK_Application` int(11) NOT NULL,
  `FK_Parent` int(11) DEFAULT NULL,
  `ApplicationLevel` tinyint(4) NOT NULL,
  `Description` varchar(35) NOT NULL,
  `Sequence` tinyint(4) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Table structure for table `product_x_application`
--

DROP TABLE IF EXISTS `product_x_application`;
CREATE TABLE `product_x_application` (
  `PK_Product_X_Application` int(11) NOT NULL,
  `Product_PKID` varchar(36) NOT NULL,
  `FK_Application` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Indexes for dumped tables
--

--
-- Indexes for table `application`
--
ALTER TABLE `application`
  ADD PRIMARY KEY (`PK_Application`);

--
-- Indexes for table `product_x_application`
--
ALTER TABLE `product_x_application`
  ADD PRIMARY KEY (`PK_Product_X_Application`),
  ADD KEY `Product_PKID` (`Product_PKID`),
  ADD KEY `FK_Application` (`FK_Application`);

--
-- AUTO_INCREMENT for dumped tables
--

--
-- AUTO_INCREMENT for table `application`
--
ALTER TABLE `application`
  MODIFY `PK_Application` int(11) NOT NULL AUTO_INCREMENT;
--
-- AUTO_INCREMENT for table `product_x_application`
--
ALTER TABLE `product_x_application`
  MODIFY `PK_Product_X_Application` int(11) NOT NULL AUTO_INCREMENT;
--
-- Constraints for dumped tables
--

--
-- Constraints for table `product_x_application`
--
ALTER TABLE `product_x_application`
  ADD CONSTRAINT `product_x_application_ibfk_1` FOREIGN KEY (`Product_PKID`) REFERENCES `product` (`Product_PKID`) ON DELETE CASCADE ON UPDATE CASCADE,
  ADD CONSTRAINT `product_x_application_ibfk_2` FOREIGN KEY (`FK_Application`) REFERENCES `application` (`PK_Application`) ON DELETE CASCADE ON UPDATE CASCADE;
SET FOREIGN_KEY_CHECKS=1;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

请注意,application表的主键是在ALTER table语句中定义的。以下是5.5服务器导出的文件:

-- phpMyAdmin SQL Dump
-- version 3.5.8.2
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: Jan 10, 2016 at 05:09 AM
-- Server version: 5.5.42-37.1-log
-- PHP Version: 5.4.23

SET FOREIGN_KEY_CHECKS=0;
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

--
-- Database: `spmorell_sami`
--

-- --------------------------------------------------------

--
-- Table structure for table `application`
--

DROP TABLE IF EXISTS `application`;
CREATE TABLE `application` (
  `PK_Application` int(11) NOT NULL AUTO_INCREMENT,
  `FK_Parent` int(11) DEFAULT NULL,
  `ApplicationLevel` tinyint(4) NOT NULL,
  `Description` varchar(35) NOT NULL,
  `Sequence` tinyint(4) NOT NULL,
  PRIMARY KEY (`PK_Application`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=15 ;

-- --------------------------------------------------------

--
-- Table structure for table `product_x_application`
--

DROP TABLE IF EXISTS `product_x_application`;
CREATE TABLE `product_x_application` (
  `PK_Product_X_Application` int(11) NOT NULL AUTO_INCREMENT,
  `Product_PKID` varchar(36) NOT NULL,
  `FK_Application` int(11) NOT NULL,
  PRIMARY KEY (`PK_Product_X_Application`),
  KEY `Product_PKID` (`Product_PKID`),
  KEY `FK_Application` (`FK_Application`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1633 ;

--
-- Constraints for dumped tables
--

--
-- Constraints for table `product_x_application`
--
ALTER TABLE `product_x_application`
  ADD CONSTRAINT `product_x_application_ibfk_2` FOREIGN KEY (`FK_Application`) REFERENCES `application` (`PK_Application`) ON DELETE CASCADE ON UPDATE CASCADE,
  ADD CONSTRAINT `product_x_application_ibfk_1` FOREIGN KEY (`Product_PKID`) REFERENCES `product` (`Product_PKID`) ON DELETE CASCADE ON UPDATE CASCADE;
SET FOREIGN_KEY_CHECKS=1;

这里,application表的主键在定义表时立即定义。我认为问题在于,product_x_application表(在系统试图重新创建application表时已经存在)对一个表有外键约束,该表在重新创建时没有外键上所需的索引,因为主键尚未定义。

共有1个答案

仇和蔼
2023-03-14

外键应该引用唯一的列(例如,主键)。pk_application目前不是这样的列。但是,从它的名称来看,您似乎想让它成为一个主键:

ALTER TABLE `application` 
ADD CONSTRAINT `application_pk` PRIMARY KEY (`PK_Application`);
 类似资料:
  • 我已经安装了我的jdk文件。我还在用户变量和系统变量的高级设置中设置了我的路径。当我试图通过javac编译我的程序时filename.java命令提示符显示javac不被识别为内部或外部命令。我再次设定了我的道路,但问题仍然是一样的

  • 我安装了Java JDK,然后在高级设置中设置了系统环境的路径,但在命令提示符中仍然无法识别。。 这是截图

  • 问题内容: 我将我的MySQL数据库插入WAMP服务器时遇到了麻烦。我打算发布模式的图像,但这是我不能的第一篇文章。 下面是执行的脚本。 但是然后我得到这个错误: 我不知道为什么。谁能帮我? 问题答案: 我迅速搜寻了你,它把我带到了这里。我引用: 如果您尝试添加名称已经在其他地方使用的约束,则会收到此消息 要检查约束,请使用以下SQL查询: 在此处查找更多信息,或尝试查看错误发生的位置。看起来像是

  • 问题内容: 尝试运行gradle时,出现以下错误: 但是,当我检查JAVA_HOME变量时,我得到: 我的JAVA_HOME是在.bashrc中定义的,我已经仔细检查过它是否已设置为源。 运行还确认JAVA_HOME设置正确并且在PATH上。 我还检查了符号连接这反过来又正确的符号链接 另外,我检查了或中没有重复的JAVA_HOME定义。 所以我的问题是Gradle如何/为什么找到,更重要的是如何

  • 问题内容: 尝试在mysql中创建表时出现错误。 有解决的技巧吗? 错误: 问题答案: 查看有关外键约束的MySQL手册: 如果重新创建已删除的表,则该表必须具有符合引用该表的外键约束的定义。如前所述,它必须具有正确的列名和类型,并且必须在引用的键上具有索引。如果不满足这些条件,MySQL将返回错误号1005,并在错误消息中引用错误150。 一些想法: 最好删除表,并使用格式正确的语法对其进行新建