【问题标题】:mysql ( innodb )foreign key constraints problemsmysql(innodb)外键约束问题
【发布时间】:2010-12-07 05:58:43
【问题描述】:

我在尝试为 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 中的条目。

当我尝试创建表 C 时遇到错误: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。 “表定义不正确,只能有一个自动列,必须定义为键。”

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

谢谢!

【问题讨论】:

    标签: mysql sql foreign-keys mysql-error-1005 mysql-error-1075


    【解决方案1】:

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

    您有两个表的自动递增列。我认为这些应该是主键 - 实体的 PID,用户的 USERID。如果您使用 ENTITYID 查询 ENTITY,或使用 NAME 查询 USER,则一定要为两者创建索引。

    现在表 C 定义了 ENTITY 和 USER 之间的多对多关系。 C 中有两列指向 PID 和 USERID,每列都有外键。 C 的主键就是两者的组合。

    像这样:

    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
    };
    

    【讨论】:

    • 感谢您的帖子!我正在重新设计我的表格以避免这些问题。
    【解决方案2】:

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

    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]
    

    来源:Alter table syntax

    【讨论】:

      【解决方案3】:

      每当我这样做时,我肯定会发现最好先定义所有表,然后再通过单独的 ALTER 查询应用约束。您避免了很多“我需要此表首先存在”之类的问题。

      【讨论】:

        猜你喜欢
        • 2016-03-19
        • 1970-01-01
        • 2014-06-23
        • 1970-01-01
        • 2013-08-12
        • 2020-07-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多