支持事务、行级锁和外键。

4

由于某些原因,我无法创建此表:

CREATE TABLE user_role (
  user_id VARCHAR(20) NOT NULL,
  role_id INTEGER UNSIGNED NOT NULL,

  FOREIGN KEY (user_id)
    REFERENCES users(user_id),
  FOREIGN KEY (role_id)
    REFERENCES roles(role_id)
);

下面这张类似的表格没有问题:
CREATE TABLE role_perm (
  role_id INTEGER UNSIGNED NOT NULL,
  perm_id INTEGER UNSIGNED NOT NULL,

  FOREIGN KEY (role_id)
    REFERENCES roles(role_id),
  FOREIGN KEY (perm_id)
    REFERENCES permissions(perm_id)
);

我收到的错误消息是: #1005 - 无法创建表'test.user_role' (errno: 150) (详细信息...) 支持事务、行级锁定和外键 有任何想法吗?
2个回答

9
请参见 http://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html 如果您重新创建一个已删除的表,则必须具有符合引用它的外键约束的定义。 它必须具有正确的列名称和类型,并且必须在引用键上具有索引,如前所述。 如果不满足这些条件,MySQL将返回错误1005并在错误消息中引用错误150,这意味着外键约束未正确形成。
如果没有提供roles和permissions表的定义,那么很难猜测,但是可以简单概括文档:
  • ...为了在列上拥有外键,您必须在“目标”列上拥有索引。
  • ...为了在列上拥有外键,源列和目标列都必须具有相同的类型(包括适用的大小)。
  • ...为了在列上拥有外键,两个表都必须使用InnoDB引擎。

1
谢谢,我使用了不匹配的类型。 - mister martin
不得不阅读这篇文章才发现我在一个可为空的列上设置了非空,谢谢。 - rmontagud

0
对于我的情况,我处理多个数据库。在我尝试创建表时,返回了以下错误:"事务、行级锁和外键"。此错误是由于关系表不存在导致的。它无意间从另一个数据库中识别到该表存在,但是我只需创建关系表即可解决问题。我考虑了在此论坛中提供的关系建议,因为它也与MySql的版本有关。

你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接