免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2620 | 回复: 4
打印 上一主题 下一主题

mysql5.0设置外键奇怪报错 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-12 02:29 |只看该作者 |倒序浏览
10可用积分
debian mysql5.0

create table parent( id int not null primary key ) engine = innodb;
create table child(
id int ,
parent_id int,
index par_id (parent_id),
foreign key (parent_id) references parent(id)
) engine=innodb;

这个是手册上的例子,没有问题,通过

DROP TABLE IF EXISTS `myweb_kind`;
CREATE TABLE IF NOT EXISTS `myweb_kind` (
        `id` tinyint(4) unsigned NOT NULL auto_increment PRIMARY KEY,
        `kind` char(20) NOT NULL
) ENGINE=INNODB DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;

-- 内容的子类
DROP TABLE IF EXISTS `myweb_category`;
CREATE TABLE IF NOT EXISTS `myweb_category` (
        `id` tinyint(4) unsigned NOT NULL auto_increment PRIMARY KEY,
        `category` char(20) NOT NULL,
        `kind_id` tinyint(4) NOT NULL,
        INDEX (`kind_id`),
        FOREIGN KEY (`kind_id`) REFERENCES myweb_kind(id)
) ENGINE=INNODB DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;


can't create table './myweb/myweb_category.dfm

这是我的例子,错误信息如上
一样的用户,一样的语法(exist之类的去掉也是一样问题)

我又用了django的orm试了一下,
django把这项工作分为三步
两个create,最后再alter category
我用sqlall 把语句打出来,然后自己在控制台里输入,还是报错,郁闷坏了

最佳答案

查看完整内容

建立外键的前提: 本表的列必须与外键类型相同(外键必须是外表主键)。外键作用: 使两张表形成关联,外键只能引用外表中的列的值!指定主键关键字: foreign key(列名)引用外键关键字: references (外键列名)事件触发限制: on delete和on update , 可设参数cascade(跟随外键改动), restrict(限制外表中的外键改动),set Null(设空值),set Default(设默认值),[默认]no action例如:outTable表 主键 id 类型 int创建含有外键的表 ...

论坛徽章:
1
白银圣斗士
日期:2015-11-23 08:33:04
2 [报告]
发表于 2009-02-12 02:29 |只看该作者
建立外键的前提: 本表的列必须与外键类型相同(外键必须是外表主键)。

外键作用: 使两张表形成关联,外键只能引用外表中的列的值!

指定主键关键字: foreign key(列名)

引用外键关键字: references <外键表名>(外键列名)

事件触发限制: on delete和on update , 可设参数cascade(跟随外键改动), restrict(限制外表中的外键改动),set Null(设空值),set Default(设默认值),[默认]no action

例如:

outTable表 主键 id 类型 int

创建含有外键的表:
create table temp(
id int,
name char(20),
foreign key(id) references outTable(id) on delete cascade on update cascade);

说明:把id列 设为外键 参照外表outTable的id列 当外键的值删除 本表中对应的列筛除 当外键的值改变 本表中对应的列值改变。


自己实践 才能完全了解外键的作用 关键是:事件触发限制的作用

你的问题出在建立外键的前提: 本表的列必须与外键类型相同(外键必须是外表主键)。

论坛徽章:
1
白银圣斗士
日期:2015-11-23 08:33:04
3 [报告]
发表于 2009-02-12 09:12 |只看该作者
DROP TABLE IF EXISTS `myweb_kind`;
CREATE TABLE IF NOT EXISTS `myweb_kind` (
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`id` tinyint(4) unsigned  NOT NULL  auto_increment PRIMARY KEY,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`kind` char(20) NOT NULL
) ENGINE=INNODB DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;


DROP TABLE IF EXISTS `myweb_category`;
CREATE TABLE IF NOT EXISTS `myweb_category` (
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`id` tinyint(4) unsigned NOT NULL  auto_increment PRIMARY KEY ,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`category` char(20) NOT NULL,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`kind_id` tinyint(4) unsigned NOT NULL ,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INDEX (`kind_id`),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FOREIGN KEY (`kind_id`) REFERENCES myweb_kind(id)
) ENGINE=INNODB DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;

论坛徽章:
0
4 [报告]
发表于 2009-02-12 17:22 |只看该作者
没想到unsigned,谢谢

论坛徽章:
1
白银圣斗士
日期:2015-11-23 08:33:04
5 [报告]
发表于 2009-02-12 17:26 |只看该作者
原帖由 ztkx 于 2009-2-12 17:22 发表
没想到unsigned,谢谢


要心细,眼细。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP