我在尝试为 MySql(Innodb)中的表生成外键时遇到了几个问题。你能帮帮我吗?
参考表:
*create table entity
{
PID INT(20) auto inc not null,
ENTITYID INT(20) not null,
details VARCHAR(100) not null,
primary key(PID,ENTITYID)
}
create table user
{
USERID int(20) auto inc not null,
NAME VARCHAR(45) not null,
joindate DATETIME not null,
location VARCHAR(100) not null,
primary key(USERID,NAME) not null
}*
Referencing table:
*create table C
{
ENTITYID INT(20) not null,
NAME VARCHAR(45) not null,
foreign key ENTITYID_C constraint ENTITYID references entity(ENTITYID) on delete cascade,
foreign key name_C constraint NAME references user(NAME) on delete cascade,
primary key(ENTITYID,NAME)
}*
我需要表 C 中的 2 个外键,因为在删除相应实体或相应用户时必须删除 C 中的条目。
当我尝试创建表 CI 时遇到错误:ERROR 1005: Can't create table (errno: 150)。我怀疑这是因为我没有遵守 mysql 规范中规定的规则。 http://dev.mysql.com/doc/refman/5.4/en/innodb-foreign-key-constraints.html
规范的以下部分/规则是什么意思?
“InnoDB 需要在外键和引用键上建立索引,以便外键检查可以快速且不需要表扫描。在引用表中,必须有一个索引,其中外键列按相同顺序列为第一列。”
是不是说C表的外键需要和实体表和用户表的主键对应,这样实体表的ENTITYID必须在主键的第一位,而用户表的NAME必须在主键的第一位。换句话说,我的主键声明应该重写如下吗?
entity table --> primary key(ENTITYID,PID) ,
user table --> primary key(NAME,USERID)
如果是这样,当我尝试重新排序上述键声明时,我遇到错误 1075。“表定义不正确,只能有一个自动列,并且必须将其定义为键。”
如何使自动递增键(代理键)在索引顺序列表中排在第二位,以便我符合规范?
谢谢 !