16

当我尝试在 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)
4

5 回答 5

30

查看有关外键约束的 MySQL 手册:

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

一些想法:

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

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

外键:

fer_id SMALLINT NOT NULL

和 origin 字段(我们提供的参考):

id INT(11) UNSIGNED NOT NULL

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

于 2015-12-09T19:37:22.293 回答
2

如果您恢复数据库备份,您可以通过在 .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 */;
于 2017-05-07T00:17:59.427 回答
1

原因之一是外键列数据类型和长度应与引用表键列相同。例如,引用表列是 mediumint(11),外键列是 int(11),表示使用外键创建表时会出错。

于 2015-05-20T12:04:21.697 回答
1

最重要的是,您需要确保两个表/字段都匹配 CHARSET 设置。UTF 类型字段的大小可以与“latin1”大不相同。两个表上的 SHOW CREATE TABLE 将显示是否存在不匹配

于 2016-01-28T00:37:40.813 回答