Mysql #1005-Can';t创建表';xxx.项目';(错误编号:150)

Mysql #1005-Can';t创建表';xxx.项目';(错误编号:150),mysql,Mysql,我正在为一家酒店创建数据库,但无法创建“Item”表 显示的错误是 #1005 - Can't create table 'xxx.item' (errno: 150) 以下是我的SQL查询: create table menu ( menu_id INT , menu_name varchar(100) , PRIMARY KEY (menu_id) ); create table categories ( categories_id INT ,

我正在为一家酒店创建数据库,但无法创建
“Item”

显示的错误是

#1005 - Can't create table 'xxx.item' (errno: 150) 
以下是我的SQL查询:

create table menu ( 
    menu_id INT 
  , menu_name varchar(100)
  , PRIMARY KEY (menu_id) 
); 

create table categories ( 
    categories_id INT 
  , category_name varchar(100)
  , PRIMARY KEY (categories_id) 
); 

create table menu_category_item ( 
    mci_id INT 
  , menu_id INT
  , categories_id INT 
  , item_id INT 
  , item_type INT
  , restaurant_id INT 
  , PRIMARY KEY (mci_id)
  , FOREIGN KEY (menu_id) 
      REFERENCES menu(menu_id)
  , FOREIGN KEY (categories_id) 
      REFERENCES categories(categories_id)
  , FOREIGN KEY (restaurant_id) 
      REFERENCES restaurants(restaurant_id)
); 

create table item (
    item_id INT
  , item_name varchar(100)
  , item_price decimal
  , FOREIGN KEY (item_id) 
      REFERENCES menu_category_item (item_id)
);

请帮我摆脱困境

假设这就是您正在运行的所有SQL,这里的问题是没有
餐厅
表,因此尝试创建
菜单\u类别\u项
会出现错误150

由于
menu\u category\u item
未能创建,因此
item
无法引用它,因此也给出了150错误


这在下面的
ER\u CANT\u CREATE\u表中有详细说明

我认为您需要对外键的目标设置一个唯一的索引/约束(在这种情况下,menu_category_item.item_id可以让它知道目标表中的哪一行被引用。但是我可能会混淆我的SQL风格

我认为问题在于数据库的结构,您应该将item_id作为item表中的主键,然后让menu category_item表引用它。例如:

create table item (
    item_id INT
  , item_name varchar(100)
  , item_price decimal
  , PRIMARY KEY (item_id));

create table menu_category_item ( 
    mci_id INT 
  , menu_id INT
  , categories_id INT 
  , item_id INT 
  , item_type INT
  , restaurant_id INT 
  , PRIMARY KEY (mci_id)
  , FOREIGN KEY (menu_id) 
      REFERENCES menu(menu_id)
  , FOREIGN KEY (categories_id) 
      REFERENCES categories(categories_id)
  , FOREIGN KEY (restaurant_id) 
      REFERENCES restaurants(restaurant_id)
  , FOREIGN KEY (item_id) 
      REFERENCES item(item_id)
); 
如果我是正确的,您的项目表将包含项目,您需要一个主键。菜单项目类别基本上是将项目与菜单匹配,因此您可以在这里添加外键

@Adam的评论如下:

一般来说:1-每个表都应该有一个主键,2-外键 键通常应该与目标表中的主键相对 是例外,但这些规则是基本数据库的良好起点 国际海事组织设计


菜单\类别\项。项\ id
未定义索引

需要对
外键
约束进行监督

添加此-
ALTER TABLE menu\u category\u item添加索引菜单\u category\u item(菜单\u category\u item)


我的数据库中有餐厅表。创建表菜单\类别\项时没有错误。但我在创建项目表时出错。请将此添加到查询的末尾
ALTER table menu \类别\项添加索引菜单\类别\项(菜单\类别\项)
在创建
菜单(类别)项时
表。这样在创建项目表时不会出现错误谢谢段落..我会尝试一下..Simon你能告诉我InnoDB命令吗?因为我在InnoDB中找不到任何东西你的意思是说我应该更改菜单(类别)项并使项目(id)唯一吗?@gagandepsharma不你不能不要这样做,因为您可能在>1菜单上有一个项目。您需要将项目id作为项目表的主键。检查我的答案。请参阅@Joshua Kissoon的答案。作为规则:1-每个表都应该有一个主键,2-外键通常应该与目标表的主键相对。有例外,但这些规则是良好的开始在IMO中为基本DB设计预留位置。OP的表中没有这样的列
menu\u category\u item
menu\u category\u item
。这听起来像是建议添加一个新列,然后
index
it。顺便说一句:OP发布的
edit
中有以前版本没有的错误。您最好回滚编辑
version 2
@Ravinder-是一个打字错误。谢谢:)可能遗漏了一些内容。但我还是回到了你的版本。Joshua非常感谢。我会试试这个。我会重新设计这两个表,让你知道。
CREATE TABLE menu_category_item ( 
  mci_id INT , 
  menu_id INT, 
  categories_id INT , 
  item_id INT , 
  item_type INT, 
  restaurant_id INT ,
  PRIMARY KEY (mci_id), 
  FOREIGN KEY (menu_id) REFERENCES menu(menu_id), 
  FOREIGN KEY (categories_id) REFERENCES categories(categories_id), 
  FOREIGN KEY (restaurant_id) REFERENCES restaurants(restaurant_id),

 ALTER TABLE `menu_category_item` ADD INDEX `item_id` (`item_id`)
);