以前学的SQL语句都忘得差不多了,真失败。
现在要建立两张表:一张是学生基本信息表tb_student 一张是求职信息表tb_sjob 用的数据库是mysql-4.0.14b-win+Navicat V8.0
建立的时候遇到了几个问题
建立两个表后
CREATE TABLE `tb_student` (
  `password` varchar(50) default '',
  `sname` varchar(20) NOT NULL default '',
  `name` varchar(20) default '',
  `age` int(4) default NULL,
  `sex` tinyint(1) default NULL,
  `birthday` datetime default NULL,
  `school` varchar(50) default NULL,
  `specialty` varchar(50) default NULL,
  `knowledge` varchar(20) default NULL,
  `email` varchar(50) default NULL,
  `resume` text,
  PRIMARY KEY  (`sname`)
) TYPE=MyISAM;CREATE TABLE `tb_sjob` (
  `jobid` int(4) NOT NULL default '0',
  `sname` varchar(20) default NULL,
  `specialty` varchar(50) default NULL,
  `job` varchar(50) default NULL,
  `emolument` varchar(50) default NULL,
  `ptime` datetime default NULL,
  `atime` datetime default NULL,
  `other` varchar(200) default NULL,
  PRIMARY KEY  (`jobid`)
) TYPE=MyISAM;就是无法用Navicat建立外键,也不知道怎么建立表关系
表关系为:
-----------------------------------------------------
  主键表               |    外键表        |    关系
-----------------------------------------------------
 名称        | 字段名  |  名称   | 字段名 |级联更新|级联删除
-----------------------------------------------------
tb_studnet | sanme   |tb_sjob |sname  |  是    |  是
------------------------------------------------------
请各位指点一下,不胜感激

解决方案 »

  1.   

    先在powerdesign里建表
    之后把preview里的copy出来运行就ok了
      

  2.   

    楼上的意思是下载这个powerdesign插件来用?
      

  3.   

    尝试建立外键的时候总是报错:
    1005 can't create table errno:150
      

  4.   

    MYSQL里面的MyISAM不支持外键,所以你无法用Navicat建外键
    把TYPE=MyISAM; 
    改为TYPE=InnoDB就可以了
      

  5.   

    MYSQL的reference中是这样写的:
    对于InnoDB之外的其他存储引擎,MySQL服务器能够解析CREATE TABLE语句中的FOREIGN KEY语法,但不能使用或保存它。未来将进行扩展,能够将这类信息保存到表规范文件中,以便能被mysqldump和ODBC检索。稍后,还将为MyISAM表实现外键约束。
      

  6.   

    楼上的您好,修改后还是不行,不知道还有哪里没设置好
    修改后的两个表为:CREATE TABLE `tb_student` (
      `password` varchar(50) default '',
      `sname` varchar(20) NOT NULL default '',
      `name` varchar(20) default '',
      `age` int(4) default NULL,
      `sex` tinyint(1) default NULL,
      `birthday` datetime default NULL,
      `school` varchar(50) default NULL,
      `specialty` varchar(50) default NULL,
      `knowledge` varchar(20) default NULL,
      `email` varchar(50) default NULL,
      `resume` text,
      PRIMARY KEY  (`sname`),
      UNIQUE KEY `student_index` (`sname`)
    ) TYPE=InnoDB;CREATE TABLE `tb_sjob` (
      `jobid` int(4) NOT NULL default '0',
      `sname` varchar(20) NOT NULL default '',
      `specialty` varchar(50) default NULL,
      `job` varchar(50) default NULL,
      `emolument` varchar(50) default NULL,
      `ptime` datetime default NULL,
      `atime` datetime default NULL,
      `other` varchar(200) default NULL,
      PRIMARY KEY  (`jobid`),
      UNIQUE KEY `sjob_index` (`jobid`)
    ) TYPE=InnoDB;
      

  7.   

    本来使用Navicat V8.0的时候没有报错,后来改用MySQLQueryBrowser它也自动报了说MyISAM无法使用外键,但是我改为InnoDB依然无法建立
      

  8.   

    可以创建外键啊。ALTER TABLE `test`.`tb_sjob` ADD CONSTRAINT `FK_tb_sjob_1` FOREIGN KEY `FK_tb_sjob_1` (`sname`)
        REFERENCES `tb_student` (`sname`)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT;你应该注意,是在tb_sjob创建sname字段到tb_student的外键。
      

  9.   

    哈哈,我知道为什么不能建立外键啦~哈哈~原来还要在tb_sjob里添加一个sname的索引~
      

  10.   

    接下来就是不知道怎么在mysql里建立表关系表关系为: 
    -----------------------------------------------------------
      主键表              |    外键表        |    关系 
    -----------------------------------------------------------
    名称        | 字段名  |  名称  | 字段名 |级联更新|级联删除 
    -----------------------------------------------------------
    tb_studnet | sanme  |tb_sjob |sname  |  是    |  是 
    -----------------------------------------------------------
      

  11.   

    我想问问设置了这两项的意思是什么?
    ON DELETE RESTRICT    ON UPDATE RESTRICT;
      

  12.   


    外键约束的4种选项:
     [ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION}]
    RESTRICT 就是当你要删除的父表记录在子表中已经有关联的时候,不运行删除。换句话说,你必须先把子表中关联的记录先删除,才能删除父表记录。
    CASCADE 级联删除,就是当你要删除的父表记录时,MYSQL会自动先帮你把子表的关联记录删除。
    SET NULL 就是把子表的关联字段设置为NULL,这个的前提是子表的关联字段允许为NULL
    NO ACTION 跟RESTRICT 一样吧
      

  13.   

    举例:
    假设学生表是主表,工作表是关联子表,每个学生可以有多个工作。
    如果学生A已经在工作表中有2个工作记录
    RESTRICT :当你删除学生A时,MYSQL会报错,告诉你违反了外键约束条件
    CASCADE :当你删除学生A时,MYSQL会先替你把工作表的2个工作记录删掉,再删除学生A
      

  14.   

    哈哈,似乎设置ON DELETE CASCADE ON UPDATE CASCADE就等于设置了级联更新 级联删除详细是:
    限制(Restrict)。不允许进行修改或删除操作。若修改或删除主表的主键时,如果子表中存在子记录,系统将产生一个错误提示。这是缺省的参照完整性设置。 置空(Set Null)。如果外键列允许为空,若修改或删除主表的主键时,把子表中参照的外键列设置为空值(NULL)。 置为缺省(Set Default)。如果指定了缺省值,若修改或删除主表的主键时,把子表中参照的外键设置为缺省值(Default)。 级联(Cascade)。把主表中主键修改为一个新的值时,相应修改子表中外键的值;或者删除主表中主键的记录时,要相应删除子表中外键的记录PS:基础真的很重要
      

  15.   

    感谢hbwhwang详细的回答。
    再问一个问题行吗?
    在mysql里怎样设置自动编号的?
    需要在tb_sjobl的jobid字段的数据类型设置为自动编号的int
      

  16.   

    找到了,自动编号似乎是把数据类型设置为:auto_increment