如果是空表是很简单的 
但是现在是业务表已经有几万条数据。所以产生难以解决外键问题。
主键表
a(id pk int )
记录如下
1
2外键表b(id pk int, a int)
1   1
2   null模拟我的业务数据
b表的字段a  fk(a表 id)int。 现在建立失败提示错误如下 :
1005--can't create table './test/#sql-79c8_32708.frm' (errno:150)
不知道如何解决 

解决方案 »

  1.   

    确认你的磁盘空间未满。另外你的表的存储引擎是什么?innodb支持外键,myisam不支持外键
      

  2.   

    建立结构与工作表相同的临时表,建立外键,再将工作表中的记录INSERT INTO临时表
      

  3.   

    innodb 
    是在线数据表 。 很头痛,建立几个小表(外键有空字段),很顺利。
    现在这2个大表(每个3万数据),我去掉了不存在的a表的 b的对应外键的值
    最终发现还是不行,不知道什么原因 (我已经花了2小时删掉不存在的 数据select id ,accId  from User where accId  not in (select id from Account)
    执行结果是空哦
      

  4.   

    你的ibdata 文件尺寸多大了?
    FAT32下,最大4G[code=BatchFile]H:\>dir "C:\Program Files\MySQL\MySQL Server 5.1\data\ib*"
     Volume in drive C is xxx
     Volume Serial Number is xx Directory of C:\Program Files\MySQL\MySQL Server 5.1\data07/01/2009  09:13a          10,485,760 ibdata1
    07/01/2009  09:13a          25,165,824 ib_logfile0
    06/18/2009  02:00p          25,165,824 ib_logfile1
                   3 File(s)     60,817,408 bytes
                   0 Dir(s)  31,074,816,000 bytes freeH:\>[/code]
      

  5.   

    通过PHPmyadmin可以很好的创建外键
      

  6.   

    1个表有3万多记录,另外1表2万多数据。
    有1个 a表 account表 
    另外2个大表 b c 
    其中一个是ok的 ,但是另外一个死活建立不上去 。用工具总是抱错误
    提示错误如下 : 
    1005--can't create table './test/#sql-79c8_32708.frm' (errno:150) 
    不知道如何解决 引擎是innodb,数据我已经进行了清理。  空表模拟是成功的哦(b表c表不符合要求已经去掉)
    在有数据的情况下,就抱如上错误。很奇特 ,2表中有1个成功 说明方法是没有问题 的e
    关键还是数据  ---但是现在我已经把不符合要求的数据清理掉 了 。
    困惑原因?
      

  7.   

    出现问题的可能
    1、外键的引用类型不一样,主键是int外键是char 
    2、找不到主表中 引用的列 
    3、主键和外键的字符编码不一致, 
      

  8.   

    反复检查 
    1 开始发现int(11)另外一个是int(10),
    现在我把统一搞成10. 还是不行
    2 主外键全部是innodb
    3 主键和外键的字符编码  表全部ENGINE=InnoDB DEFAULT CHARSET=utf8;主键a    外键 b(成功)  c ------由于种种原因 只能把表结构有用的取部分,否则太长没必要
    a 表
    CREATE TABLE `a` (
      `id` int(10) unsigned NOT NULL auto_increment,
    PK
    b----这个创建外键成功
    CREATE TABLE `b` (
      `id` int(10) unsigned NOT NULL auto_increment,
      `accountId` int(10) unsigned NOT NULL default '0',
        `lastChange` datetime default NULL
      UNIQUE KEY `id` (`id`),
      KEY `id_accountId` (`id`,`accountId`),
      KEY `accountId` (`accountId`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    c  ----这个创建外键失败   ----我把表情空数据还是失败 , 不知道什么原因
    CREATE TABLE `c` (
      `id` int(11) NOT NULL auto_increment,
        `accountId` int(10) NOT NULL,
      `  `userName` varchar(10) default NULL,
      `lastUserSessionLogId` int(10) unsigned default NULL,
      PRIMARY KEY  (`id`),
      KEY `bue_ue_idx` (`betBrainUserEntity`),
      KEY `username_UE_idx` (`userName`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;痛苦死了 空表 有数据表 都试过
    c还是不成功 。  楼上帮看看吧 ---
      

  9.   

    b----这个创建外键成功 
    CREATE TABLE `b` ( 
      `id` int(10) unsigned NOT NULL auto_increment, 
      `accountId` int(10) unsigned NOT NULL default '0', 
        `lastChange` datetime default NULL 
      UNIQUE KEY `id` (`id`), 
      KEY `id_accountId` (`id`,`accountId`), 
      KEY `accountId` (`accountId`) 
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 刚才检查了 
    KEY `id_accountId` (`id`,`accountId`), 
      KEY `accountId` (`accountId`)   这些是索引 不是很重要的哦
      

  10.   

    CREATE TABLE `b` (
    `id` int(10) unsigned NOT NULL auto_increment,
    `accountId` int(10) unsigned NOT NULL default '0',
    `lastChange` datetime default NULL
    UNIQUE KEY `id` (`id`),
    KEY `id_accountId` (`id`,`accountId`),
    KEY `accountId` (`accountId`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;这个语句,本身就语法错误!
      

  11.   

    感谢前3楼 发现原因 
    a 表 
    CREATE TABLE `a` ( 
      `id` int(10) unsigned NOT NULL auto_incrementb表 是 int(10)-----导致失败c ` int(10) unsigned 所以成功。问题是现在我用什么语句可以更改这个b (当前这个表几万数据
    在线如何修改他的 int 为 unsigned int  如何做 ????)
      

  12.   


    ALTER TABLE a  MODIFY COLUMN a int(10) unsigned; 
    CREATE TABLE `b` ( `id` int(10) unsigned NOT NULL auto_increment, `a` int(10) unsigned NOT NULL,PRIMARY KEY  (`id`));
      

  13.   

    楼主,很显然,犯了 "1、外键的引用类型不一样,主键是int外键是char " 这条错误!一个是 int, 另一个是 int unsigned改一下就行了。
    另外,建议下次贴代码的时间能贴正确的,比如,下面能猜到(accountId) REFERENCES a(id)也是不容易的。谁知道你哪个是用于外键啊。mysql> CREATE TABLE `a` (
        -> `id` int(10) unsigned NOT NULL auto_increment primary key
        -> )ENGINE=InnoDB DEFAULT CHARSET=utf8;
    Query OK, 0 rows affected (0.06 sec)mysql> CREATE TABLE `b` (
        ->  `id` int(10) unsigned NOT NULL auto_increment,
        ->  `accountId` int(10) unsigned NOT NULL default '0',
        ->  `lastChange` datetime default NULL,
        ->  PRIMARY KEY `id` (`id`),
        ->  KEY `id_accountId` (`id`,`accountId`),
        ->  KEY `accountId` (`accountId`)
        -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    Query OK, 0 rows affected (0.08 sec)mysql> CREATE TABLE `c` (
        ->  `id` int(11) NOT NULL auto_increment,
        ->  `accountId` int(10) NOT NULL,
        ->  `userName` varchar(10) default NULL,
        ->  `lastUserSessionLogId` int(10) unsigned default NULL,
        ->  PRIMARY KEY  (`id`),
        ->  KEY `username_UE_idx` (`userName`)
        -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    Query OK, 0 rows affected (0.08 sec)mysql> alter table b ADD CONSTRAINT fk_b_a FOREIGN KEY (accountId) REFERENCES a(
    id);
    Query OK, 0 rows affected (0.16 sec)
    Records: 0  Duplicates: 0  Warnings: 0mysql> alter table c ADD CONSTRAINT fk_c_a FOREIGN KEY (accountId) REFERENCES a(
    id);
    ERROR 1005 (HY000): Can't create table 'test.#sql-9c4_1' (errno: 150)
    mysql>
    mysql> alter table c MODIFY accountId int(10) unsigned NOT NULL;
    Query OK, 0 rows affected (0.13 sec)
    Records: 0  Duplicates: 0  Warnings: 0mysql> alter table c ADD CONSTRAINT fk_c_a FOREIGN KEY (accountId) REFERENCES a(
    id);
    Query OK, 0 rows affected (0.11 sec)
    Records: 0  Duplicates: 0  Warnings: 0mysql>