2016-09-21 54 views
0

当在我的MySQL数据库我有两个表:SQL错误添加引用

CREATE TABLE orders (
id BIGINT AUTO_INCREMENT, 
user_id BIGINT DEFAULT 1 NOT NULL, 
price DECIMAL(18, 2) NOT NULL, 
name VARCHAR(255) NOT NULL, 
surname VARCHAR(255) NOT NULL, 
[...] 
is_fulfilled TINYINT(1) DEFAULT '0' NOT NULL, 
INDEX user_id_idx (user_id), 
PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ENGINE = INNODB; 

CREATE TABLE user (
id INT AUTO_INCREMENT, 
username VARCHAR(128) NOT NULL UNIQUE, 
email VARCHAR(128) NOT NULL UNIQUE, 
[...] 
INDEX name_idx_idx (username), 
PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ENGINE = INNODB; 

当我试图建立关系

ALTER TABLE orders ADD CONSTRAINT orders_user_id_user_id FOREIGN KEY (user_id) REFERENCES user(id); 

我得到这个错误

#1005 - Can't create table 'druk.#sql-b38_173' (errno: 150) 

那张桌子有什么问题吗?

+3

此问题已在此处回答; [链接回答errno 150](http://stackoverflow.com/questions/4061293/mysql-cant-create-table-errno-150) 和这里; (http://stackoverflow.com/questions/1457305/mysql-creating-tables-with-foreign-keys-giving-errno-150) – Intern87

回答

0

这是一个非常奇怪的错误,与当前表单中的表格不相关。因此,您需要正确重新创建表。

但是,您确实有问题。列orders.user_id的类型与user.id的类型不匹配。您应该将其更改为:

user_id INT DEFAULT 1 NOT NULL, 

Here是一个SQL Fidde。

我应该补充说,默认值为“1”似乎很奇怪。

+0

错误与表格有关,错误1005表示; 如果你重新创建一个被删除的表,它必须有一个符合引用它的外键约束的定义。它必须具有正确的列名和**类型**,并且它必须具有引用键上的索引,如前所述。如果这些不满足,MySQL将返回错误1005并引用错误消息中的错误150,这意味着外键约束未正确形成。 对于替换它的表,外键类型必须相同。 – Intern87

+0

@ Intern87。 。 。答案中我不清楚。我想指出代码有另一个错误。 –

+0

Thx,问题出在不同的类型。 – Rodgard

0

只要确保两个字段匹配类型。将orders.user_id更改为INT或将user.id更改为BIGINT。将orders.user_id更换为INT似乎更合理,除非您预计有数百万用户...