关于MySQL的外键问题

myblessu 2004-11-01 05:16:20

在mysql的官方页面 http://dev.mysql.com/doc/mysql/en/example-Foreign_keys.html 上有个使用外键的例子.

大家请查看该网页.按该页面的操作,查询shirt的结果如下.

SELECT * FROM shirt;
+----+---------+--------+-------+
| id | style | color | owner |
+----+---------+--------+-------+
| 1 | polo | blue | 1 |
| 2 | dress | white | 1 |
| 3 | t-shirt | blue | 1 |
| 4 | dress | orange | 2 |
| 5 | polo | red | 2 |
| 6 | dress | blue | 2 |
| 7 | t-shirt | white | 2 |
+----+---------+--------+-------+

可是在我的机子上确实显示:

SELECT * FROM shirt;
+----+---------+--------+-------+
| id | style | color | owner |
+----+---------+--------+-------+
| 1 | polo | blue | 0 |
| 2 | dress | white | 0 |
| 3 | t-shirt | blue | 0 |
| 4 | dress | orange | 0 |
| 5 | polo | red | 0 |
| 6 | dress | blue | 0 |
| 7 | t-shirt | white | 0 |
+----+---------+--------+-------+


这说明外键根本没起作用,这是为什么?



后来我把那建表的语句改了一下,换成如下格式的,结果也是一样.

CREATE TABLE `person` (
`id` smallint(5) unsigned NOT NULL auto_increment,
`name` char(60) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=InnoDB AUTO_INCREMENT=1;

CREATE TABLE `shirt` (
`id` smallint(5) unsigned NOT NULL auto_increment,
`style` enum('t-shirt','polo','dress') NOT NULL default 't-shirt',
`color` enum('red','blue','orange','white','black') NOT NULL default 'red',
`owner` smallint(5) unsigned NOT NULL REFERENCES person(id),
PRIMARY KEY (`id`)
) TYPE=InnoDB AUTO_INCREMENT=1 ;
...全文
176 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
myblessu 2004-11-03
  • 打赏
  • 举报
回复
我不明白在于,既然owner是个外键,而person表中的id字段只有1和2这两个值,那owner就应该只能为1或2才对,如果是别的数值,插入时应该出错才对呀.
Cain 2004-11-02
  • 打赏
  • 举报
回复
嗯,这个我也测试过
这是LAST_INSERT_ID()的问题
LAST_INSERT_ID()应该获取当前连接下的person最后一次insert的id

所以会得到owner=0,至于owner=4我也搞不太清楚,你在当前连接下再插入一条也应该还是4,但是如果你断开连接,再重新连通mysql,owner就应该是8了,他好像取的是上一次连接id的第一次插入的shirt.id
hahawen 2004-11-02
  • 打赏
  • 举报
回复
这个外键好像不太管用,以前有个朋友测试过,所以自己就没有再考录用过,不支持联动删除.....所以相当于没有用
myblessu 2004-11-02
  • 打赏
  • 举报
回复
我知道了,原来我是在php代码中执行,没得到正确结果,后来在DOS命令提示符下使用就可以了,

但现在又发现新问题了.

当我按那页面的代码测试后.
SELECT * FROM shirt;
+----+---------+--------+-------+
| id | style | color | owner |
+----+---------+--------+-------+
| 1 | polo | blue | 1 |
| 2 | dress | white | 1 |
| 3 | t-shirt | blue | 1 |
| 4 | dress | orange | 2 |
| 5 | polo | red | 2 |
| 6 | dress | blue | 2 |
| 7 | t-shirt | white | 2 |
+----+---------+--------+-------+

,这结果是正确的,然后我用下面的php插入一条记录

mysql_query("INSERT INTO shirt VALUES(NULL,'dress','orange',LAST_INSERT_ID())");

,在这php执行后,我又转到DOS命令提示符下,在用

INSERT INTO shirt VALUES(NULL,'dress','orange',LAST_INSERT_ID());

语句执行了一下.结果现在

SELECT * FROM shirt;
+----+---------+--------+-------+
| id | style | color | owner |
+----+---------+--------+-------+
| 1 | polo | blue | 1 |
| 2 | dress | white | 1 |
| 3 | t-shirt | blue | 1 |
| 4 | dress | orange | 2 |
| 5 | polo | red | 2 |
| 6 | dress | blue | 2 |
| 7 | t-shirt | white | 2 |
| 8 | dress | orange | 0 |
| 9 | dress | orange | 4 |
+----+---------+--------+-------+

这owner的指怎么会为0或4呢.在person表的id中没有这两个值呀?
myblessu 2004-11-02
  • 打赏
  • 举报
回复
奇怪奇怪,我的问题在哪里呢?
tt007 2004-11-02
  • 打赏
  • 举报
回复
我测试也是一样的,估计是楼主自己的问题了。。。。
多菜鸟 2004-11-02
  • 打赏
  • 举报
回复
我的测试也没有问题。楼主确定一下自己的MYSQL吧。
zilong544 2004-11-02
  • 打赏
  • 举报
回复
请教,是不是默认安装就支持外键了?我的是windows环境,版本4.0.17
xuzuning 2004-11-02
  • 打赏
  • 举报
回复
测试无误,请确认mysql版本在MySQL 3.23.44 及以上
myblessu 2004-11-02
  • 打赏
  • 举报
回复
不会吧,我的是 mysql 4.0.18 呀
Cain 2004-11-01
  • 打赏
  • 举报
回复
刚才又做了几次测试
应该是你mysql的问题

除非你执行SQL语句的时候顺序颠倒了
bflovesnow 2004-11-01
  • 打赏
  • 举报
回复
看看 MySQL 版本.
Cain 2004-11-01
  • 打赏
  • 举报
回复
In MySQL 3.23.44 and up

会不会是你的mysql的版本问题
Cain 2004-11-01
  • 打赏
  • 举报
回复
我将他的代码复制粘贴,在自己的机器上测试了一下,查询结果是正常的

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧