MySQL 约束在插入时失败,但在另一台服务器上的相同数据库中工作

标签 mysql

感谢所有看过的人!

我有开发服务器、阶段服务器和产品服务器。

我在开发环境中创建了数据库,然后进行了 mysqldump,并在 stage 和 prod 上安装了相同的数据库。

stage 和 prod 是相同的硬件和操作系统,这是最新的 LAMP 堆栈。

当我在产品上插入子行时,出现错误,但它可以在我的开发和阶段计算机上运行。这很奇怪。 所以忽略这一点,这是我的简单数据(2 个表)和我的错误:

   CREATE TABLE `Customer` (
  `Customer_Id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `AccessLevel_Id` int(11) unsigned NOT NULL,
  `UserId` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `FirstName` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `LastName` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `Phone` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
  `Email` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  `Passwd` tinytext COLLATE utf8_unicode_ci NOT NULL,
  `HearAbout` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
  `Active` tinyint(1) NOT NULL DEFAULT '1',
  `Created` datetime NOT NULL,
  PRIMARY KEY (`Customer_Id`),
  UNIQUE KEY `UserId` (`UserId`),
  KEY `idxEmail` (`Email`),
  KEY `R8` (`AccessLevel_Id`),
  CONSTRAINT `R8` FOREIGN KEY (`AccessLevel_Id`) REFERENCES `accesslevel` (`AccessLevel_Id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |

CREATE TABLE `Recipient` (
  `Recipient_Id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `Customer_Id` int(11) unsigned NOT NULL,
  `FirstName` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
  `LastName` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
  `NickName` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
  `LastUsed` datetime DEFAULT NULL,
  `Active` tinyint(1) NOT NULL DEFAULT '1',
  `Created` datetime NOT NULL,
  PRIMARY KEY (`Recipient_Id`),
  KEY `R14` (`Customer_Id`),
  CONSTRAINT `R14` FOREIGN KEY (`Customer_Id`) REFERENCES `customer` (`Customer_Id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |

这是适用的 ID。

mysql> select * from Customer where Customer_Id=1;
+-------------+----------------+--------+-----------+----------+----------------+---------------------+------------------------------------+----------------+--------+---------------------+
| Customer_Id | AccessLevel_Id | UserId | FirstName | LastName | Phone          | Email               | Passwd                             | HearAbout      | Active | Created             |
+-------------+----------------+--------+-----------+----------+----------------+---------------------+------------------------------------+----------------+--------+---------------------+
|           1 |              3 | userid | Heywood   | Jablome    | (313) 248-1234 | heywood@jablome.com | $jxAB3sfe9CEixrNL3vKH6Jr7z. | Other |      1 | 2013-01-12 19:23:27 |
+-------------+----------------+--------+-----------+----------+----------------+---------------------+------------------------------------+----------------+--------+---------------------+
1 row in set (0.00 sec)

这里是约束错误:有比我聪明的人可以启发我吗?我真的很想知道是什么原因造成的!!

mysql> INSERT INTO `Recipient` (`Customer_Id`, `NickName`, `FirstName`, `LastName`, `Created`) VALUES ('1', 'Moe', 'Moe', 'Howard', '2013-02-01 15:25:19');
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`db1`.`Recipient`, CONSTRAINT `R14` FOREIGN KEY (`Customer_Id`) REFERENCES `customer` (`Customer_Id`) ON DELETE CASCADE ON UPDATE CASCADE)

这是 show innodb status\G 的结果

------------------------
LATEST FOREIGN KEY ERROR
------------------------
130201 16:56:25 Transaction:
TRANSACTION 0 3429, ACTIVE 0 sec, process no 8699, OS thread id 3245587822336 inserting, thread declared inside InnoDB 500
mysql tables in use 1, locked 1
1 lock struct(s), heap size 368, 0 row lock(s), undo log entries 1
MySQL thread id 309, query id 97882 localhost root update
INSERT INTO `Recipient` (`Customer_Id`, `NickName`, `FirstName`, `LastName`, `Created`) VALUES ('1', 'Moe', 'Moe', 'Howard', '2013-02-01 15:25:19')
Foreign key constraint fails for table `db1`.`Recipient`:
,
  CONSTRAINT `R14` FOREIGN KEY (`Customer_Id`) REFERENCES `customer` (`Customer_Id`) ON DELETE CASCADE ON UPDATE CASCADE
Trying to add to index `R14` tuple:
DATA TUPLE: 2 fields;
 0: len 4; hex 00000001; asc     ;; 1: len 4; hex 0000000a; asc     ;;

But the parent table `db1`.`customer`
or its .ibd file does not currently exist!

最佳答案

好的,其他人遇到了同样的问题,直到现在我才在这里找到它:MySQL Foreign Key Error Even With Existent References这让我怀疑我用 XAMPP 打包的 Mac 版本的 MySQL。现在是 5.1.44。有一个错误会导致转储文件创建不正确,并导致此错误。

切换到更高版本的 mySQL 解决了该问题。

关于MySQL 约束在插入时失败,但在另一台服务器上的相同数据库中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14656507/

相关文章:

php - 在 MySQL 表中搜索文本字符串,如果找到则返回 [简单]

php - 从 MySql 数据库中获取值到表单中

mysql - SQL - 将属性值设置为同一记录中另一个属性的值

php - 连接 PHP 记录集中的符号

php - 将每个类别获取的结果数量限制为仅 4 个,而不是显示 "See More Results"

php - sql count 连接表中精确或相似记录的数量

php - 通知 : Undefined index PHP error

mysql - SQL Join - 需要解释

mysql - 在Ubuntu上找不到mysql的数据目录

mysql - ruby 的SQL错误