如果是空表是很简单的
但是现在是业务表已经有几万条数据。所以产生难以解决外键问题。
主键表
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)
不知道如何解决
但是现在是业务表已经有几万条数据。所以产生难以解决外键问题。
主键表
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)
不知道如何解决
是在线数据表 。 很头痛,建立几个小表(外键有空字段),很顺利。
现在这2个大表(每个3万数据),我去掉了不存在的a表的 b的对应外键的值
最终发现还是不行,不知道什么原因 (我已经花了2小时删掉不存在的 数据select id ,accId from User where accId not in (select id from Account)
执行结果是空哦
)
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]
有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
关键还是数据 ---但是现在我已经把不符合要求的数据清理掉 了 。
困惑原因?
1、外键的引用类型不一样,主键是int外键是char
2、找不到主表中 引用的列
3、主键和外键的字符编码不一致,
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还是不成功 。 楼上帮看看吧 ---
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`) 这些是索引 不是很重要的哦
`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;这个语句,本身就语法错误!
a 表
CREATE TABLE `a` (
`id` int(10) unsigned NOT NULL auto_incrementb表 是 int(10)-----导致失败c ` int(10) unsigned 所以成功。问题是现在我用什么语句可以更改这个b (当前这个表几万数据
在线如何修改他的 int 为 unsigned int 如何做 ????)
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`));
另外,建议下次贴代码的时间能贴正确的,比如,下面能猜到(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>