当我尝试在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)
答案 0 :(得分:29)
查看关于foreign key constrains的MySQL手册:
如果重新创建已删除的表,则必须具有定义 符合引用它的外键约束。它必须 拥有正确的列名和类型,并且必须具有索引 如前所述,引用的密钥。如果不满意,MySQL 返回错误号1005并在错误中引用错误150 消息。
一些想法:
ENGINE=InnoDB;
添加到CREATE TABLE
- 命令。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 */;