gti*_*ilx 152 mysql sql phpmyadmin mysql-error-150
我试图导入.sql文件,并在创建表时失败.
这是失败的查询:
CREATE TABLE `data` (
`id` int(10) unsigned NOT NULL,
`name` varchar(100) NOT NULL,
`value` varchar(15) NOT NULL,
UNIQUE KEY `id` (`id`,`name`),
CONSTRAINT `data_ibfk_1` FOREIGN KEY (`id`) REFERENCES `keywords` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Run Code Online (Sandbox Code Playgroud)
我从同一个数据库导出.sql,我删除了所有的表,现在我试图导入它,为什么它失败了?
MySQL:无法创建表'./dbname/data.frm'(错误号:150)
OMG*_*ies 163
如果重新创建已删除的表,则它必须具有符合引用它的外键约束的定义.它必须具有正确的列名和类型,并且必须在引用的键上具有索引,如前所述.如果不满足这些,MySQL将返回错误1005并在错误消息中引用错误150,这意味着未正确形成外键约束.类似地,如果ALTER TABLE由于错误150而失败,则意味着对于更改的表将错误地形成外键定义.
Dan*_*ath 97
错误150表示您的外键有问题.可能外表上的键不是完全相同的类型?
Den*_*aia 61
您可以通过运行SHOW ENGINE INNODB STATUS;然后LATEST FOREIGN KEY ERROR在输出中查找来获取实际的错误消息.
小智 24
我认为正确的所有这些答案都会误导这个问题.
如果要使用外键还原转储文件,则在开始还原之前,实际答案是:
SET FOREIGN_KEY_CHECKS=0;
Run Code Online (Sandbox Code Playgroud)
因为在外表甚至存在之前,恢复自然会创建一些约束.
Era*_*rin 11
错误号码 150表示外键约束失败.您可能在外键所依赖的表(表keywords)之前创建此表.首先创建该表,它应该工作正常.
如果没有,删除外键语句并在创建表后添加它 - 您将获得有关特定约束失败的更有意义的错误消息.
jua*_*ala 10
有很多事情可以导致errno 150,所以对于搜索这个主题的人来说,这就是我认为接近详尽的列表(Errno 150的来源):
对于errno 150或errno 121,只需键入SHOW ENGINE INNODB STATUS,就会出现一个名为"LATEST FOREIGN KEY ERROR"的部分.在此之下它会给你一个非常有用的错误信息,通常会立即告诉你什么是问题.您需要SUPER权限才能运行它,因此如果您没有,则只需测试以下方案即可.
1)数据类型不匹配:列的类型必须相同
2)没有索引的父列(或以错误的顺序索引)
3)列排序不匹配
4)在NOT NULL列上使用SET NULL
5)表排序不匹配:即使列排序匹配,在某些MySQL版本上这可能是个问题.
6)父列在父表中实际上不存在.检查拼写(也许是列的开头或结尾处的空格)
7)其中一列的索引之一是不完整的,或者列对于完整索引而言太长.请注意,MySQL(除非您调整它)的最大单列密钥长度为767字节(这对应于varchar(255)UTF列)
如果你得到一个errno 121,这里有几个原因:
1)您选择的约束名称已被采用
2)在某些系统上,如果语句和表名中存在大小写差异.如果您从一台服务器转到另一台具有不同案例处理规则的服务器,这可能会让您感到困惑.
有时MySQL只是超级愚蠢 - 我可以理解外键的原因..但在我的情况下,我刚刚删除整个数据库,我仍然得到错误...为什么?我的意思是,没有数据库了......我正在使用的sql-user无法访问服务器上的任何其他数据库...我的意思是,服务器对于当前用户来说是"空的"而且我仍然得到这个错误?抱歉,我想MySQL对我说谎......但我可以处理它:)只需在你的fucky语句中添加这两行SQL:
SET FOREIGN_KEY_CHECKS = 0;
# some code that gives you errno: 150
SET FOREIGN_KEY_CHECKS = 1;
Run Code Online (Sandbox Code Playgroud)
现在应该执行sql ...如果你真的有一个外键问题,它将显示你将再次启用检查的行 - 这将失败然后..但我的服务器只是安静:)
小智 5
我有同样的问题。它与表的列Collation和Character Set 相关。确保两个表上的两列的字符集和排序规则必须相同。如果你想设置一个外键。示例 - 如果您将外键放在 userImage 表的 userID 列上,引用 users 表的 userID 列。那么对于表的两列,排序规则必须相同,即utf8_general_ci和字符集utf8。通常,当您创建表时,mysql 从服务器设置中获取这两个配置。
| 归档时间: |
|
| 查看次数: |
316434 次 |
| 最近记录: |