首页 » 编程开发 » Mysql » 正文

Mysql数据存储引擎ENGINE导致的程序执行无法插入数据的问题

问题描述:在用python开发个小程序的时候遇到个问题,python程序执行sql进行插入操作的时候,程序运行显示无报错,但数据库里显示没有数据插入,但将执行的sql复制出来在phpmyadmin里面直接执行插入操作,却可以轻松插入。

解决过程:

1、首先排除是程序错误,检查了N遍程序,发现没错误。

2、将sql语句修改为:“delete from tablename”,执行后发现表里面的数据并没有删除,说明并不是sql语句的问题导致的。

3、尝试将sql语句修改一下,换一张表,随意插入一条记录,执行后发现没问题。这就说明是表的问题导致的,既然确定是表的问题导致的,那么接下来,执行“show create table tablename” 查看表结构,发现字段的定义都没什么问题,我将刚刚插入成功的和当前插入数据有问题的这两张表的表结构进行比较,发现一张表的ENGINE=InnoDB,另外一张是ENGINE=MyISAM,这两个ENGINE值到底有什么区别呢,百度了下,发现了问题:

InnoDBMyISAM这两种都是mysql的数据库的存储引擎的类型,MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。 MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持,外键等高级数据库功能。MyISAM类型的二进制数据文件可以在不同操作系统中迁移。也就是可以直接从Windows系统拷贝到linux系统中使用。

MySQL Administrator建数据库的时候,表缺省是InnoDB类型,也就是说如果你在建表的时候不指定ENGINE,那么系统默认就是InnoDB。

那么为什么会发生本文开头描述的那样的错误呢,因为我比较懒,建表的时候没有指定ENGINE这个参数,而默认的InnoDB是执行事物特性的,也就是说,它在执行完一条sql语句的之后,是需要提交才会最终插入数据库的,所以后面必须加一句“commit;”才可以。

知道问题是建表语句中ENGINE参数设置导致的,那么问题的解决很简单,执行下面DDL语句:

ALTER TABLE tablename ENGINE = MyISAM ;

当然,你也可以将表drop掉重建,或者在执行插入操作之后,加上提交语句commit。

启动mysql数据库的命令行中添加了以下参数可以使新发布的mysql数据表都默认为MyISAM (
只影响到create语句。),将下面语句加入到my.ini,重启mysql数据库就可以了。
–default-table-type=MyISAM

后话:虽然我使用mysql已经几年了,但也仅限于平时自己写写python小程序,因为它配置起来简单方便,对mysql没有比较深的认识,我想这样的问题也就在mysql新手中会遇到吧~

 

发表评论