ERROR 1005(HY000):无法创建表(错误号:150)

时间:2012-06-15 05:52:11

标签: mysql

当我尝试在mysql中创建表时出现错误。

有关解决问题的任何提示吗?

create table stock_in(
    ind int not null auto_increment,
    itemcode varchar(10) not null,
    quantity int not null,
    description text not null,
    sales_ref int not null default -1,
    return_outwards_ref int not null default -1,
    stock_in_receipt_ref int not null default -1,
    date text not null,
    time text not null,
    username text not null,
    foreign key (sales_ref) references sales (receiptno),
    foreign key (return_outwards_ref) references returnoutwards(ind),
    primary key (ind)
);

错误:

ERROR 1005 (HY000): Can't create table 'posinventory.stock_in' (errno: 150)

5 个答案:

答案 0 :(得分:29)

查看关于foreign key constrains的MySQL手册:

  

如果重新创建已删除的表,则必须具有定义   符合引用它的外键约束。它必须   拥有正确的列名和类型,并且必须具有索引   如前所述,引用的密钥。如果不满意,MySQL   返回错误号1005并在错误中引用错误150   消息。

一些想法:

  • 更好地删除表格并使用格式良好的语法创建新表格。
  • 请务必将ENGINE=InnoDB;添加到CREATE TABLE - 命令。
  • 确保在MySQL服务器上启用了InnoDB。要验证这一点,请尝试以下命令:SHOW VARIABLES LIKE 'have_innodb'; - 如果返回YES,则启用InnoDB。
  • 检查您的命令,了解表格和字段名称中的大写和小写。
  • 不仅要检查您要创建的表,还要检查外键所引用的表。
  • 确保您的推荐表格已正确编入索引。

答案 1 :(得分:4)

有完全相同的问题。它的来源是外键和引用的类型。

外键:

fer_id SMALLINT NOT NULL

和原始字段(我们提供的参考资料):

id INT(11) UNSIGNED NOT NULL

我刚刚将fer_id INT(11)设为UNSIGNED。神奇地工作!

答案 2 :(得分:1)

其中一个原因是外键列数据类型和长度应与引用表键列相同。例如,引用表列是mediumint(11),外键列是int(11)表示在创建具有外键的表时会发生错误。

答案 3 :(得分:1)

除此之外,您还需要确保两个表/字段都与CHARSET设置匹配。 UTF类型字段的大小可以与latin1'大小不同。 两个表上的SHOW CREATE TABLE将显示是否存在不匹配

答案 4 :(得分:1)

如果还原数据库备份,可以通过在.sql文件的开头插入这些字符串来临时禁用外键检查:

/*!40030 SET NAMES UTF8 */;
/*!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 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;