【问题标题】:Supports transactions, row-level locking, and foreign keys支持事务、行级锁定和外键
【发布时间】:2013-08-15 02:22:55
【问题描述】:

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

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 - Can't create table 'test.user_role' (errno: 150) (Details...) Supports transactions, row-level locking, and foreign keys

有什么想法吗?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    http://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html

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

    如果您没有提供rolespermissions 表的定义,而是为了解释文档...

    ,这很难猜测
    • ...为了在列上有一个外键,您必须在“目标”列上有一个索引。
    • ...为了在列上有外键,“源”和“目标”列必须具有相同的类型(包括相同的大小,如果适用)。李>
    • ...为了在列上有外键,两个表必须使用 InnoDB 引擎。

    【讨论】:

    • 谢谢,我使用了不匹配的类型。
    • 必须阅读这篇文章才能看到我在应该可以为空的列上设置不为空,谢谢
    猜你喜欢
    • 2014-04-29
    • 2013-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多