首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mysql ( innodb )外键约束问题

问mysql ( innodb )外键约束问题
EN

Stack Overflow用户
提问于 2009-10-16 00:44:50
回答 3查看 3.1K关注 0票数 0

在试图为MySql(Innodb)中的表生成外键时,我遇到了几个问题。你能帮我拿一下吗?

参考表格:

代码语言:javascript
复制
*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中的两个外键,因为在删除相应的实体或相应的用户时,必须删除C中的条目。

当我尝试创建表C时,我遇到了一个错误:错误1005:无法创建表(errno: 150)。我怀疑这是因为我没有遵守mysql规范中规定的规则。http://dev.mysql.com/doc/refman/5.4/en/innodb-foreign-key-constraints.html

规范的以下部分/规则意味着什么?

"InnoDB需要外键和引用键的索引,这样外键检查就可以快速,而不需要表扫描。在引用表中,必须有一个索引,其中外键列以相同的顺序列为第一列。“。

这是否意味着表C中的外键需要与实体表和用户表中的主键相对应,以便实体表中的ENTITYID必须是主键中的第一个,而用户表中的名称必须位于主键中的第一个。换句话说,我的主键声明是否应该重写如下?

代码语言:javascript
复制
entity table -->    primary key(ENTITYID,PID)   , 
user  table -->  primary key(NAME,USERID)

如果是这样的话,当我试图重新排序上面的键声明时,我会遇到错误1075。“表定义不正确,只能有一个auto列,必须将其定义为键。”。

如何使自动递增键(代理键)在索引顺序列表中处于第二位,以使我符合规范?

谢谢!

EN

回答 3

Stack Overflow用户

发布于 2009-10-16 01:04:25

我不认为你的实体和用户的主键是正确的。我相信你把主键和索引搞混了。

这两个表都有自动增量列。我认为这些应该是主键- PID用于实体,USERID用于用户。如果您使用ENTITYID查询实体,或者用户使用名称,则可以尽一切办法为两者创建索引。

现在,表C定义了实体和用户之间的多到多关系。C中有两列指向PID和USERID,每个列都有外键。C的主键就是两者的结合。

如下所示:

代码语言:javascript
复制
create table entity
{
    pid int(20) auto inc not null,
    primary key(pid)
};

create table user
{
    userid int(20) auto inc not null,
    primary key(userid)
};

create table user_entity
{
    entity_id int(20) not null,
    user_id int(20) not null,  
    primary key(entity_id, user_id)  
    foreign key entity_id references entity(pid) on delete cascade,
    foreign key user_id references user(userid) on delete cascade
};
票数 1
EN

Stack Overflow用户

发布于 2011-01-21 09:15:22

奥利·桑德斯是对的。在删除/创建InnoDB表之前,首先删除所有约束。

代码语言:javascript
复制
ALTER TABLE tbl_name
    ADD [CONSTRAINT [symbol]] FOREIGN KEY
    [index_name] (index_col_name, ...)
    REFERENCES tbl_name (index_col_name,...)
    [ON DELETE reference_option]
    [ON UPDATE reference_option]

来源:更改表语法

票数 1
EN

Stack Overflow用户

发布于 2009-10-16 01:10:16

无论何时,我肯定地发现,最好先定义所有表,然后再用单独的ALTER查询应用约束。您可以避免这么多“我需要这个表先存在”之类的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1575905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档