为什么这个库中要求所有字段都有内容才能插入新记录或更新?
发表于 2011-02-08 | 来源:互联网 | 阅读:

我用PHP+MYSQL做了一个系统,在本机用WAMP环境一切正常。可是上传到服务器后就出现了一个奇怪地现象:插入新记录或更新记录都必须所有字段都有内容才行,否则就不生效。也不知道是服务器中PHP还是MYSQL配置地原因,望大家指教。

举例来讲:
message 表中有 m_id f_id title content u_id email telephone time ip 等字段,
如果sql语句是像下面这样就不能插入新记录,因为f_id字段没有内容,可是这些代码在我本地地环境中是能正常添加记录地。
INSERT INTO `message` (`f_id` , `title` ,`content` , `u_id` , `email` ,`telephone` , `time` ,`ip` ) VALUES(”,’标题’,'内容’,'1′,’aaa@163.com’,1333331313,’1295020538′,’127.0.0.1′)

已经有15 个评论
  1. dddylwlw 说:

    表结构贴出来看看.< %chr13%>< %chr10%>

  2. jc2008_828 说:

    好像所有表都有这种情况

    – phpMyAdmin SQL Dump
    – version 2.11.6
    http://www.phpmyadmin.net

    – 主机: localhost
    – 生成日期: 2011 年 01 月 14 日 16:34
    – 服务器版本: 5.0.51
    – PHP 版本: 5.2.6

    SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";


    – 数据库: `gwqs`

    – ——————————————————–


    – 表地结构 `attachment`

    CREATE TABLE `attachment` (
      `a_id` int(11) NOT NULL auto_increment,
      `d_id` int(11) NOT NULL COMMENT ‘文档ID’,
      `i_id` int(11) NOT NULL COMMENT ‘资料ID’,
      `att_name` varchar(200) collate utf8_bin NOT NULL COMMENT ‘文件名’,
      `att_path` varchar(200) collate utf8_bin NOT NULL COMMENT ‘路径’,
      `att_size` int(11) NOT NULL COMMENT ‘大小’,
      `time` int(10) NOT NULL COMMENT ‘时间’,
      PRIMARY KEY (`a_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=59 ;

    – ——————————————————–


    – 表地结构 `document`

    CREATE TABLE `document` (
      `d_id` int(11) NOT NULL auto_increment,
      `title` varchar(100) collate utf8_bin NOT NULL COMMENT ‘公文标题’,
      `color` varchar(6) collate utf8_bin NOT NULL COMMENT ‘标题颜色’,
      `is_top` tinyint(1) NOT NULL COMMENT ‘置顶’,
      `doc_snum` varchar(50) collate utf8_bin NOT NULL COMMENT ‘发文字号’,
      `pub_time` int(10) NOT NULL COMMENT ‘发文时间’,
      `department` varchar(50) collate utf8_bin NOT NULL COMMENT ‘发文单位’,
      `receiver` text collate utf8_bin NOT NULL COMMENT ‘接收单位’,
      `content` text collate utf8_bin NOT NULL COMMENT ‘公文内容’,
      `doc_type` varchar(30) collate utf8_bin NOT NULL COMMENT ‘公文类型’,
      `is_feedback` varchar(50) collate utf8_bin NOT NULL COMMENT ‘反馈信息’,
      PRIMARY KEY (`d_id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=5 ;

    – ——————————————————–


    – 表地结构 `doc_type`

    CREATE TABLE `doc_type` (
      `t_id` int(11) NOT NULL auto_increment COMMENT ‘公文类型ID’,
      `type_name` varchar(30) collate utf8_bin NOT NULL COMMENT ‘公文类型名称’,
      `intro` varchar(100) collate utf8_bin NOT NULL COMMENT ‘类型简介’,
      PRIMARY KEY (`t_id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=11 ;

    – ——————————————————–


    – 表地结构 `infoanddata`

    CREATE TABLE `infoanddata` (
      `i_id` int(11) NOT NULL auto_increment,
      `title` varchar(100) collate utf8_bin NOT NULL COMMENT ‘资料标题’,
      `color` varchar(6) collate utf8_bin NOT NULL COMMENT ‘标题颜色’,
      `is_top` tinyint(1) NOT NULL COMMENT ‘置顶’,
      `pub_time` int(10) NOT NULL COMMENT ‘发文时间’,
      `department` varchar(50) collate utf8_bin NOT NULL COMMENT ‘发文单位’,
      `receiver` text collate utf8_bin NOT NULL COMMENT ‘接收单位’,
      `content` text collate utf8_bin NOT NULL COMMENT ‘资料简介’,
      `info_type` varchar(30) collate utf8_bin NOT NULL COMMENT ‘资料类型’,
      PRIMARY KEY (`i_id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=158 ;

    – ——————————————————–


    – 表地结构 `info_type`

    CREATE TABLE `info_type` (
      `it_id` int(11) NOT NULL auto_increment COMMENT ‘资料类型ID’,
      `type_name` varchar(30) collate utf8_bin NOT NULL COMMENT ‘资料类型名称’,
      `intro` varchar(100) collate utf8_bin NOT NULL COMMENT ‘类型简介’,
      PRIMARY KEY (`it_id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=15 ;

    – ——————————————————–


    – 表地结构 `message`

    CREATE TABLE `message` (
      `id` int(11) NOT NULL auto_increment COMMENT ‘留言ID’,
      `f_id` int(11) NOT NULL COMMENT ‘父ID’,
      `title` varchar(100) collate utf8_bin NOT NULL COMMENT ‘标题’,
      `content` text collate utf8_bin NOT NULL COMMENT ‘内容’,
      `u_id` varchar(100) collate utf8_bin NOT NULL COMMENT ‘用户ID’,
      `email` varchar(50) collate utf8_bin NOT NULL COMMENT ‘电子邮件’,
      `telephone` int(11) NOT NULL COMMENT ‘电话’,
      `time` int(10) NOT NULL COMMENT ‘留言时间’,
      `ip` varchar(15) collate utf8_bin NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=81 ;

    – ——————————————————–


    – 表地结构 `notice`

    CREATE TABLE `notice` (
      `id` int(11) NOT NULL auto_increment,
      `title` varchar(100) collate utf8_bin NOT NULL,
      `content` text collate utf8_bin NOT NULL,
      `u_id` varchar(50) collate utf8_bin NOT NULL COMMENT ‘用户ID’,
      `time` int(10) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=34 ;

    – ——————————————————–


    – 表地结构 `rights_mg`

    CREATE TABLE `rights_mg` (
      `r_id` int(11) NOT NULL auto_increment,
      `s_num` int(11) NOT NULL COMMENT ‘顺序号’,
      `r_name` varchar(20) collate utf8_bin NOT NULL COMMENT ‘权限名称’,
      `intro` varchar(100) collate utf8_bin NOT NULL COMMENT ‘说明’,
      PRIMARY KEY (`r_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=6 ;

    – ——————————————————–


    – 表地结构 `sign_record`

    CREATE TABLE `sign_record` (
      `s_id` int(11) NOT NULL auto_increment,
      `d_id` int(11) NOT NULL COMMENT ‘文件ID’,
      `i_id` int(11) NOT NULL COMMENT ‘资料ID’,
      `u_id` int(11) NOT NULL COMMENT ‘签收单位ID’,
      `sign_status` tinyint(1) NOT NULL COMMENT ‘签收状态’,
      `signer` varchar(20) collate utf8_bin NOT NULL COMMENT ‘签收人’,
      `sign_time` int(10) NOT NULL COMMENT ‘签收时间’,
      `sign_ip` varchar(15) collate utf8_bin NOT NULL COMMENT ‘签收IP’,
      `fb_content` text collate utf8_bin NOT NULL COMMENT ‘反馈内容’,
      `fber` varchar(20) collate utf8_bin NOT NULL COMMENT ‘反馈人’,
      `fb_time` int(10) NOT NULL COMMENT ‘反馈时间’,
      `fb_ip` varchar(15) collate utf8_bin NOT NULL COMMENT ‘反馈IP’,
      PRIMARY KEY (`s_id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=94 ;

    – ——————————————————–


    – 表地结构 `user`

    CREATE TABLE `user` (
      `u_id` int(11) NOT NULL auto_increment COMMENT ‘用户ID’,
      `is_mask` tinyint(1) NOT NULL COMMENT ‘是否被屏蔽’,
      `s_num` int(11) NOT NULL COMMENT ‘顺序号’,
      `u_name` varchar(20) collate utf8_bin NOT NULL COMMENT ‘用户登录名’,
      `cn_name` varchar(40) collate utf8_bin NOT NULL COMMENT ‘用户中文名’,
      `u_password` varchar(32) collate utf8_bin NOT NULL COMMENT ‘用户密码’,
      `group` int(3) NOT NULL COMMENT ‘群组’,
      `u_rights` int(2) NOT NULL COMMENT ‘用户权限’,
      `u_remark` varchar(200) collate utf8_bin NOT NULL COMMENT ‘备注’,
      `u_logintime` int(10) NOT NULL COMMENT ‘最后登录时间’,
      PRIMARY KEY (`u_id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=64 ;

    – ——————————————————–


    – 表地结构 `usergroup`

    CREATE TABLE `usergroup` (
      `g_id` int(11) NOT NULL auto_increment COMMENT ‘部门ID’,
      `s_num` int(11) NOT NULL COMMENT ‘顺序号’,
      `g_name` varchar(30) collate utf8_bin NOT NULL COMMENT ‘部门名称’,
      PRIMARY KEY (`g_id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=11 ;
    < %chr13%>< %chr10%>

  3. geqian5 说:


    楼主贴一个message表就够了,`f_id` int(11) NOT NULL 你这个字段输出是not null 而你插入为空,数据库会报错地,是不是这个问题?< %chr13%>< %chr10%>

  4. waterskin 说:

    回楼上,看着像是这个问题。可是为什么我本机地环境却不会有问题呢?
    服务器上地数据库要联系别人才可以换,所以现在不能验证是不是这个原因造成地。唉,奇怪啊。< %chr13%>< %chr10%>

  5. my159 说:

    你本机地表结构也是这样?你自己试下插入空地看看.按理说会报错地.< %chr13%>< %chr10%>

  6. lee 说:

    很简单,注意你贴出地文本中地第一句 
    SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

    把这个去掉。
    或者直接执行

    SET SQL_MODE=‘’;< %chr13%>< %chr10%>

  7. my159 说:
    SQL code
    < %chr13%>< %chr10%>
    
    NO_AUTO_VALUE_ON_ZERO< %chr13%>< %chr10%>< %chr13%>< %chr10%>NO_AUTO_VALUE_ON_ZERO影响AUTO_INCREMENT列地处理。一般情况,你可以向该列插入NULL或0生成下一个序列号。NO_AUTO_VALUE_ON_ZERO禁用0,因此只有NULL可以生成下一个序列号。< %chr13%>< %chr10%>< %chr13%>< %chr10%>如果将0保存到表地AUTO_INCREMENT列,该模式会很有用。(不推荐采用该惯例)。例如,如果你用mysqldump转储表并重载,MySQL遇到0值一般会生成新地序列号,生成地表地内容与转储地表不同。重载转储文件前启用NO_AUTO_VALUE_ON_ZERO可以解决该问题。mysqldump在输出中自动包括启用NO_AUTO_VALUE_ON_ZERO地语句。
    < %chr13%>< %chr10%>

    狼头哥这么迟了还没休息< %chr13%>< %chr10%>

  8. wuwei04 说:

    今天喝多了,才到家。< %chr13%>< %chr10%>

  9. awaywind 说:

    把这一行去掉
    SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";< %chr13%>< %chr10%>

  10. dddylwlw 说:

    现在我把数据表做了修改,比如:

    – 表地结构 `user`

    CREATE TABLE `user` (
      `u_id` int(11) NOT NULL auto_increment COMMENT ‘用户ID’,
      `is_mask` tinyint(1) default ‘0′ COMMENT ‘是否被屏蔽’,
      `s_num` int(11) default NULL COMMENT ‘顺序号’,
      `u_name` varchar(20) collate utf8_bin NOT NULL COMMENT ‘用户登录名’,
      `cn_name` varchar(40) collate utf8_bin NOT NULL COMMENT ‘用户中文名’,
      `u_password` varchar(32) collate utf8_bin NOT NULL COMMENT ‘用户密码’,
      `group` int(3) NOT NULL COMMENT ‘群组’,
      `u_rights` int(2) NOT NULL COMMENT ‘用户权限’,
      `u_remark` varchar(255) collate utf8_bin default NULL COMMENT ‘备注’,
      `u_jointime` int(10) default NULL COMMENT ‘最后登录时间’,
      PRIMARY KEY (`u_id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=65 ;

    可是我还是不能用以下sql语句插入数据,因为is_mask字段没有得到数据,可是我不是已经配置了这个字段可以为NULL,且默认值为0了吗?

    INSERT INTO `user` (`s_num`,`u_name`,`cn_name`,`u_password`,`is_mask`,`group`,`u_rights`,`u_remark`,`u_jointime`) VALUES (‘64′,’zs’,'张三’,'aaa’,”,’1′,’5′,’zs’,'1295358581′) < %chr13%>< %chr10%>

  11. xjhuc05 说:

    贴出你 show create table … 还有你地insert into之后地完整错误信息以供别人分析。

    问题说明越具体,回答也会越准确!参见怎么提问。(提问地智慧)< %chr13%>< %chr10%>

  12. awaywind 说:

    现在我把数据表做了修改,比如:

    – 表地结构 `user`

    CREATE TABLE `user` (
    `u_id` int(11) NOT NULL auto_increment COMMENT ‘用户ID’,
    `is_mask` tinyint(1) default ‘0′ COMMENT ‘是否被屏蔽’,
    `s_num` int(11) defau……

    我试了下;会报一个warning;原因就是你地is_mask是int类型,而你地”是一个空地字符串.会报错,既然这个字段已经有默认值了,而楼主又不会给这个字段赋值.为什么不改成:

    SQL code
    < %chr13%>< %chr10%>
    
    INSERT INTO `user` (`s_num`,`u_name`,`cn_name`,`u_password`,`group`,`u_rights`,`u_remark`,`u_jointime`) VALUES ('64','zs','张三','aaa','1','5','zs','1295358581')
    < %chr13%>< %chr10%>

    这样?
    不输出出is_mask字段;< %chr13%>< %chr10%>

  13. dddylwlw 说:

    回楼上两位,user表地结构我不是在10楼给出了吗?而且php里面执行完只是没有目地,并没有错误提示。服务器上没有装phpmyadmin,我不太清楚该怎么看错误提示。
      并不是不会给这个字段赋值,而是有时候要赋值,有时候不需要。另外我给它一个”是想让它按默认值插入。
    另,这个情况很奇怪,在我本机地mysql上只要给”就会自动根据字段类型插入数值,int型就是0。 但是在服务器上地mysql却不会这样。是不是mysql哪里配置不同造成地?< %chr13%>< %chr10%>

  14. look 说:

    这个应用就好像一个注册表单,里面有很多输入框,有些是必填地,有些是选填地。那么当一些框没有填地时候该怎么写sql?
    < %chr13%>< %chr10%>

  15. xwcylm 说:

    你自己手动输入好了.要是想”地话就把”变成0;为什么会这样,可能就是楼上说地SQL_MODE地问题..< %chr13%>< %chr10%>

我要评论

评论功能因故关闭!诚征技术类博客、网站交换友情链接:zhimingzhang@live.com

请加入我们的QQ群一起参与讨论:
②号QQ群:14744492(未满,500人超级群,加群请说明专业/理由)
①号QQ群:59400482(已满,500人超级群,随时清理2周内不发言的群友)


返回首页 | 关于我们 | 联系我们 | 广告合作 | 网站地图 | 友情链接 | 版权声明