JAVA培训
位置:首页数据库MySQL
 问题状态
 
跪求一个关于mysql的问题
 悬赏分:100  已经过期   过期时间2007-7-5 14:47
我现在有3张表,student,sc,course,代码如下
CREATE TABLE  sc (
  `id` int(10) unsigned NOT NULL auto_increment COMMENT 'id',
  `Sno` int(10) unsigned NOT NULL default '0' COMMENT '学号',
  `Cno` int(10) unsigned NOT NULL default '0' COMMENT '课程号',
  `Grade` int(10) unsigned default NULL COMMENT '成绩',
  PRIMARY KEY  (`id`),
  KEY `FK_sc_1` (`Sno`),
  KEY `FK_sc_2` (`Cno`),
  CONSTRAINT `FK_sc_1` FOREIGN KEY (`Sno`) REFERENCES `student` (`id`),  /* 外键信息 */
  CONSTRAINT `FK_sc_2` FOREIGN KEY (`Cno`) REFERENCES `course` (`id`)   /* 外键信息 */
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;

CREATE TABLE  student (
  `id` int(10) unsigned NOT NULL auto_increment COMMENT 'id',
  `Sno` int(10) unsigned NOT NULL default '0' COMMENT '学号',
  `Sname` varchar(45) default NULL COMMENT '姓名',
  `Ssex` char(2) default NULL COMMENT '性别',
  `Sdept` varchar(10) default NULL COMMENT '所在系',
  `Sage` int(10) unsigned default NULL COMMENT '年龄',
  `Saddress` varchar(45) default NULL COMMENT '籍贯',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;

CREATE TABLE  course (
  `id` int(10) unsigned NOT NULL auto_increment COMMENT 'id',
  `Cno` int(10) unsigned default NULL COMMENT '课程号',
  `Cname` varchar(45) default NULL COMMENT '课程名',
  `Ccredit` int(10) unsigned default NULL COMMENT '学分',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;
其中student中有数据:
好比(id:1,sno:20040001,sname:"李文",ssex:"f",sdep:"asdf",sage:20,saddress:"上海")
course中有数据:
好比(id:1,cno:1,cname:"数据库",ccredit:2)
 
我现在的问题是student表和course表一切正常,sc表也能建立,但建立好sc表后就无法插入数据例如插入如下数据
(insert into sc values (1,20040001,1,82);)
他就报ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint f
ails (`hibernate/sc`, CONSTRAINT `FK_sc_1` FOREIGN KEY (`Sno`) REFERENCES `stude
nt` (`id`))错
提问者:marcodeba@hotmail.com  - 头衔:开发爱好者   
    
    
 回复答案 共15条
  你的 student 表的主键是“id”你插入的应该是
(insert into sc values (1,1,1,82);)
因为你的student表中的Sno=“20040001”它不是主键。
    回答者:zhangboxinji@126.com  - 头衔:开发爱好者 2008-4-14 19:49:13  

  我发现你的插入语句有两个问题,其一,你的课程号字节那么长,不应该定义为int类型,应定义为varchar或是更大的数据类型;其二,你的id定义的是自动增长类型,在插入时,语句应写为:insert into sc values (id,20040001,1,82);
    回答者:ydhmzb@163.com  - 头衔:开发爱好者 2008-4-11 3:13:17  

  你本意应该是这样的吧:
CREATE TABLE  sc (
  `id` int(10) unsigned NOT NULL auto_increment COMMENT 'id',
  `Sno` int(10) unsigned NOT NULL default '0' COMMENT '学号',
  `Cno` int(10) unsigned NOT NULL default '0' COMMENT '课程号',
  `Grade` int(10) unsigned default NULL COMMENT '成绩',
  PRIMARY KEY  (`id`),
  KEY `FK_sc_1` (`Sno`),
  KEY `FK_sc_2` (`Cno`),
  CONSTRAINT `FK_sc_1` FOREIGN KEY (`Sno`) REFERENCES `student` (`sno`),  /* 外键信息 */
  CONSTRAINT `FK_sc_2` FOREIGN KEY (`Cno`) REFERENCES `course` (`cno`)   /* 外键信息 */
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;
yanglingsx@sina.com 都回答过了
    回答者:wxywwwt@163.com  - 头衔:开发爱好者 2008-3-5 14:55:02  

  由于sc表id列为auto_increment,插入数据时应缺省:
insert into sc(Sno,Cno,Grade) values (1,1,82);
    回答者:yiliu_001@sohu.com  - 头衔:开发爱好者 2008-3-3 13:49:06  

  怎么不用mysql-font的软件啊,用那个就没有那些SQL语法错误了~~
    回答者:gyjmail@qq.com  - 头衔:开发爱好者 2008-2-27 11:59:22  

  用MySQL-Front显得不够专业.哈哈...
    回答者:jakie.cai@163.com  - 头衔:开发爱好者 2008-1-6 11:55:44  

  第一步:原来的东西都不要改动,仅仅将插入信息改为           insert into sc values (1,2004001,1,82);//注意4后面是两个0,不是三个0
第二步:如果运行成功继续看我的回答,否则不用向下看了
第三步:原理解释--〉当设置外健约束的时候,向含有外建的表中插入的数据必须是参照表里面已经存在的。我说'已经存在的'是指由外建约束的字段,如果没有约束,那么就简单了,随便插入了。
    回答者:qwxi_1@163.com  - 头衔:开发爱好者 2007-10-4 0:31:21  

  你本意是这个吧?
CREATE TABLE  sc (
  `id` int(10) unsigned NOT NULL auto_increment COMMENT 'id',
  `Sno` int(10) unsigned NOT NULL default '0' COMMENT '学号',
  `Cno` int(10) unsigned NOT NULL default '0' COMMENT '课程号',
  `Grade` int(10) unsigned default NULL COMMENT '成绩',
  PRIMARY KEY  (`id`),
  KEY `FK_sc_1` (`Sno`),
  KEY `FK_sc_2` (`Cno`),
  CONSTRAINT `FK_sc_1` FOREIGN KEY (`Sno`) REFERENCES `student` (`sno`),  /* 外键信息 */
  CONSTRAINT `FK_sc_2` FOREIGN KEY (`Cno`) REFERENCES `course` (`cno`)   /* 外键信息 */
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;
吧,外键定义错了,sc.sno 对的是 student.sno , 不是 student.id
cno同上
    回答者:yanglingsx@sina.com  - 头衔:开发爱好者 2007-8-13 16:17:09  

  我觉得前面一位正解!
    回答者:liuwei40301@163.com  - 头衔:开发爱好者 2007-8-9 11:35:24  

   报错的原因:往sc表中插值时违反了外键约束。
 解决的办法:先分别往course表和student表中添加主键为20040001和1的记录,在执行insert into sc values (1,20040001,1,82);
如果要往sc表中插入记录,sno 和 cno 字段的值在student和course表中必须要有相同的主键值。
    回答者:sshzhangwg@163.com  - 头衔:初级程序员 2007-7-27 10:10:45  

  呵呵,有工具就用,有什么好笑的,呵呵~~
不过代码也要写啊
    回答者:taidugaodu@163.com  - 头衔:开发爱好者 2007-7-13 15:19:49  

  建议下个
MySQL-Front(MYSQL 图形界面操作工具)
进行 手动插入数据
我一般都是 这样做的
大家不要笑我哈
    回答者:cmmysnake@163.com  - 头衔:开发爱好者 2007-7-12 20:25:58  

  你手动在数据库中插入,如何能插入就证明你建的表没有问题,
如果不能就说明你的表主键有问题,
最后给你提个建意,你最好不要在数据库中建立关联,如果你用hibernate的话,你可以在hibernate中建立关联。这样如何你以后要改数据库的话就不会出问题了,你如果用hibernate的话,往SC表中插入数据必顺将和这个表有关联的对象一起插入
    回答者:li-qi-guang@163.com  - 头衔:开发爱好者 2007-7-7 1:32:54  

  insert into sc(Sno,Cno,Grade) values(2004001,1,82);
测试一下这样写,如果使用insert into sc values(2004001,1,82);
我也插入不了数据;
    回答者:zhangqingjun198309@163.com  - 头衔:开发爱好者 2007-7-6 11:30:04  

  insert into sc values (1,20040001,1,82);
由于sc表id列为auto_increment,插入数据时应缺省,请试一下:
insert into sc values (20040001,1,82);
    回答者:szp1972126@163.com  - 头衔:开发爱好者 2007-7-5 21:42:59  

我的回答:
回答即可得10分,被采纳则可得50分+悬赏分。
  验证码

 
 
最新问题
欢迎使用本系统,智囊团。踊跃回答,赢得积分。

使用有问题请到 帮助
 
关于我们 | 商务合作 | 招聘信息 | 客服中心 | 服务条款 | 免责声明 | 网站导航 |java培训QQ留言
Copyright 2007 zhinangtuan.net.cn all rights reserved 版权所有