支持事务,行级锁定和外键

时间:2013-08-14 17:26:17

标签: mysql

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

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

有什么想法吗?

1 个答案:

答案 0 :(得分:7)

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

  

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

如果猜测相当困难,因为您没有提供rolespermissions表的定义,而是解释文档...

  • ...为了在列上拥有外键,必须在“目标”列上有一个索引。
  • ...为了在列上拥有外键,“source”和“target”列必须具有相同的类型(如果适用,包括相同的大小)。
  • ...为了在列上有外键,两个表必须使用InnoDB引擎。