Mysql如何修改unique key

2012年11月23日 没有评论

mysql可以使用unique key来确保数据的准确性,unique key可以是一个字段,也可以是多个字段,对应已经存在的unique key如何修改呢?目前我使用的方法是分两步来完成,先drop掉,然后在创建。需要注意的是drop时关键字是“index”,而创建时关键词是“unique key”,命令如下:

alter table table_name drop index `uk_name`;

alter table table_name add unique key `new_uk_name` (`col1`,`col2`);

注意:如果表中已经存在数据,可能会创建失败,原因是col1, col2无法满足unique。

分类: MySQL 标签:

MySql 获取表的字段名

2012年9月4日 没有评论

mysql安装成功后可以看到已经存在mysql、information_schema和test这个几个数据库,information_schema库中有一个名为COLUMNS的表,这个表中记录了数据库中所有表的字段信息。知道这个表后,获取任意表的字段就只需要一条select语句即可。例如:

select COLUMN_NAME from information_schema.COLUMNS 
where table_name = 'your_table_name';

上述的做法有一点问题,如果多个数据库中存在你想要查询的表名,那么查询的结果会包括全部的字段信息。通过DESC information_schema.COLUMNS可以看到该表中列名为TABLE_SCHEMA是记录数据库名,因此下面的写法更为严格

select COLUMN_NAME from information_schema.COLUMNS 
where table_name = 'your_table_name' 
and table_schema = 'your_db_name';
分类: MySQL 标签:

mysql timestamp 类型自动更新

2012年8月4日 没有评论

mysql创建表时,如果使用timestamp类型没有指定默认值,它会把第一个使用timestamp的字段默认值设定为CURRENT_TIMESTAMP,如果后面还有其他字段使用timestamp,则指定为‘0000-00-00 00:00:00’,同时Extra列中看到on update CURRENT_TIMESTAMP,注意它会在更新操作时会把该字段时间设置为当前时间,即使你更新时没有指定要更新该字段。例子如下:

create table netingcn(id int(11), ts1 timestamp, ts2 timestamp);

desc netingcn;

+-------+-----------+------+-----+---------------------+-----------------------------+
| Field | Type      | Null | Key | Default             | Extra                       |
+-------+-----------+------+-----+---------------------+-----------------------------+
| id    | int(11)   | YES  |     | NULL                |                             |
| ts1   | timestamp | NO   |     | CURRENT_TIMESTAMP   | on update CURRENT_TIMESTAMP |
| ts2   | timestamp | NO   |     | 0000-00-00 00:00:00 |                             |
+-------+-----------+------+-----+---------------------+-----------------------------+

insert into netingcn(id,ts2) values(1,now());

select * from netingcn;

+------+---------------------+---------------------+
| id   | ts1                 | ts2                 |
+------+---------------------+---------------------+
|    1 | 2012-08-04 22:15:20 | 2012-08-04 22:15:20 |
+------+---------------------+---------------------+

update netingcn set ts2 = '2012-08-01' where id = 1;

select * from netingcn;

+------+---------------------+---------------------+
| id   | ts1                 | ts2                 |
+------+---------------------+---------------------+
|    1 | 2012-08-04 22:15:27 | 2012-08-01 00:00:00 |
+------+---------------------+---------------------+

在上述的例子中插入值时没有ts1,故使用当前的系统时间默认值。当使用更新,此处只是更新了ts2字段,但ts1字段值也发生了变化。所以需要注意extra信息中的提示“on update CURRENT_TIMESTAMP”,如果你想使用timestamp类型又不想让该字段存储的值随着更新而自动更新,那就需要创建表是为该类型的字段显示的指定一个默认值,可以使用CURRENT_TIMESTAMP或0000-00-00 00:00:00。例如:

create table netingcn_1(ts1 timestamp default CURRENT_TIMESTAMP, ts2 timestamp default '0000-00-00 00:00:00');

desc netingcn_1;

+-------+-----------+------+-----+---------------------+-------+
| Field | Type      | Null | Key | Default             | Extra |
+-------+-----------+------+-----+---------------------+-------+
| ts1   | timestamp | NO   |     | CURRENT_TIMESTAMP   |       |
| ts2   | timestamp | NO   |     | 0000-00-00 00:00:00 |       |
+-------+-----------+------+-----+---------------------+-------+
分类: MySQL 标签:

mysql 整型的显示宽度

2012年8月4日 没有评论

mysql数据库中对整型分为5个不同的小类型,分别是tinyint、smallint、mediumint、int和bigint,主要区别是数据库存储时使用几个字节,也就是说限定整数的范围,上述类型存储使用的字节为1、2、3、4和8。取值范围可以根据字节数来算出来。注意:它们都可以指定为无符号(大于等于零)的整数。

在使用时候往往在类型后面会用括号指定一个数字,该值的含义是表明显示宽度,对数值的范围是无关的。例如tinyint(1),tinyint(3)存储的数值范围都是-128到127。如果使用了zerofill,在显示的时候才有可能不一样。例如:

create table netingcn_test1(a tinyint(1), b tinyint(2));

insert into netingcn_test1 values(1,1),(100,100);

select * from netingcn_test1;

+------+------+
| a    | b    |
+------+------+
|    1 |    1 |
|  100 |  100 |
+------+------+

上述例子可以看到tinyint(1),tinyint(2)没有任何区别,下面使用zerofill来看看是什么情况:

create table netingcn_test2(a tinyint(1) zerofill, b tinyint(2) zerofill);

insert into netingcn_test2 values(1,1),(100,100);

select a,b,bin(a),bin(b) from netingcn_test2;   
+------+------+---------+---------+
| a    | b    | bin(a)  | bin(b)  |
+------+------+---------+---------+
|    1 |   01 | 1       | 1       |
|  100 |  100 | 1100100 | 1100100 |
+------+------+---------+---------+

可以看到当结果小于显示宽度时,左边用0补齐,当等于或超过显示宽度时正常显示,通过bin函数可以得知数据存储值都是一样的。

分类: MySQL 标签:

mac os 下安装 mysql-python

2012年6月20日 1 条评论

python中如果需要访问mysql数据库,需要额外安装第三方的库,比较流行的是库是MySQL-python,可以到http://sourceforge.net/projects/mysql-python/下载源代码。解压下载的tar.gz文件,执行如下操作即可完成安装:

python setup.py build  
python setup.py install

注意:如果mysql_config(MYSQL_HOME/bin)文件没有位于系统path下,那么需要更改site.cfg文件,在里面指定mysql_config的完整路径。

不出意外,如果你在终端中运行python,导入MySQLdb时,你会收到一个错误,提示中含有“Library not loaded: libmysqlclient.18.dylib”,错误的原因是刚编译安装的lib放在MYSQL_HOME/lib下,终端找不到此位置,解决的方法是可以做一个软链接链接到/usr/lib下,例如:

ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/

另外如果使用eclipse的pydev插件,当需要用到MySQLdb库时,需要在Libraries中指定刚安装后的egg文件的路径,该路径在安装时会有提示,例如我的按照位置为:/Library/Python/2.7/site-packages/MySQL_python-1.2.3-py2.7-macosx-10.7-intel.egg 。

mac os lion 卸载MySQL

2012年4月6日 没有评论

mac os   下要卸载MySQL,只需要吧相应的文件删除即可

先切换到root,避免每个删除前都使用sudo

sudo su

rm /usr/local/mysql
rm -rf /usr/local/mysql*
rm -rf /Library/StartupItems/MySQLCOM
rm -rf /Library/PreferencePanes/My*
rm -rf /Library/Receipts/mysql*
rm -rf /Library/Receipts/MySQL*
rm -rf /var/db/receipts/com.mysql.*

vi /etc/hostconfig
删除 MYSQLCOM 定义

另外如果自己定制了MySQL的配置文件,删除/etc/my.cnf

分类: MySQL 标签:

Mac OS X 下安装MySql遇到的问题

2012年4月6日 1 条评论

mac os x 版本:10.7.3,在mysql的官网没有发现对应版本的下载,所以下载了一个mysql-5.5.22-osx10.6-x86_64.dmg,安装什么的都比较简单,安装好后,通过系统偏好设置设置中也能正常启动MySQL服务,同时在面板中取消了开机自动启动服务。本人比较喜欢在命令行中操作,看到ReadMe.txt中的介绍,可以使用/Library/StartupItems/MySQLCOM/MySQLCOM来执行启动、停止和重启操作。

sudo /Library/StartupItems/MySQLCOM/MySQLCOM stop
服务正常停止

sudo /Library/StartupItems/MySQLCOM/MySQLCOM start
这时终端没有任何输出,服务也没有起来。

无法通过命令行启动,以为安装的有什么问题,在网上搜了一把,发现一篇官方bugs报告文章:http://bugs.mysql.com/bug.php?id=42673,也没有解决问题。经过一番周折,最后终于在/Library/StartupItems/MySQLCOM/MySQLCOM这个脚本中发现了问题,

StartService ()
{
    if [ "${MYSQLCOM:=-NO-}" = "-YES-" ] ; then
        ConsoleMessage "Starting MySQL database server"
        $SCRIPT start > /dev/null 2>&1
    fi
}

注意:在执行启动命令前作了一个判断,变量MYSQLCOM是定义在/etc/hostconfig中的,他的作用是设置MySQL是否开机自动启动,由于刚才在面板中把它设置为否,所以其值为-NO-,因而那个if就条件为FALSE,所以根本没有执行启动命令。通过看这个脚本,发现在命令行启动MySQL还可以直接执行这个 /usr/local/mysql/support-files/mysql.server 脚本即可。

另外一个问题,mac os 下mysql不需要my.cnf,用默认配置即可,如果想自己对mysql进行定制,拷贝「/usr/local/mysql/support-files/」目录下的符合自己用途一个 .cnf 文件到「/etc/」目录下并重命名为 my.cnf,然后修改 my.cnf 即可进行定制了。

配置好my.cnf后,对数据库进行重新初始化,首先确保停止mysql服务,把数据文件夹(默认为/usr/local/mysql/data)下清空,进入/usr/local/mysql目录,执行./scripts/mysql_install_db 即可。

初始化后启动数据库,在错误日志看到如下类似错误:

 [ERROR] /usr/local/mysql/bin/mysqld: Can't find file: './mysql/host.frm' (errno: 13)
 [ERROR] Fatal error: Can't open and lock privilege tables: Can't find file: './mysql/host.frm' (errno: 13)

造成上述错误的原因是数据文件夹的权限问题,必须把数据文件夹下的所有文件和文件夹的所有者该为_mysql(mac 是_mysql, linux下mysql的默认用户是mysql),命令:

chown -R _mysql:_mysql /usr/local/mysql/data

再次启动,又出现新的错误信息:

 InnoDB: Error: unable to create temporary file; errno: 13
 [ERROR] Plugin 'InnoDB' init function returned error.
 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
 [ERROR] Unknown/unsupported storage engine: InnoDB

这个问题的原因是自己定制的my.cnf中没有设置tmpdir信息,在mysqld段增加tmpdir = /var/tmp 即解决问题。

至此终于搞定Mac os 的mysql了。

分类: MySQL 标签:

mysqldump: Couldn’t execute ‘SHOW TRIGGERS LIKE ‘btaglog”: Got error 28 from storage engine (1030)

2012年3月25日 没有评论

最近准备测试一下mysql的MyISAM与InnorDB存储引擎的性能,在使用mysqldump备份数据的时候出现如标题的错误,网上查了一下,有人说是杀毒软件的问题,有人说是tmp目录太小了,由于是在linux下,可以排除杀毒软件的问题,那就是tmp目录太小了,使用df命令查看了一下硬盘的使用情况,发现硬盘全部占满,这就是造成出错的原因。曾经也碰到过由于硬盘可用空间过小的原因导致mysql服务器不能启动的事情。

分类: MySQL 标签:

mysql 导入乱码问题

2012年3月25日 没有评论

把文件中的数据导入到mysql表中时可能会碰到乱码的问题,造成乱码的根源就是编码问题,涉及到编码的有数据库和数据文件。要想导入时避免不出现乱码,只要保证数据文件的编码和导入时甚至的编码一直即可,注意:不是和数据库的编码一致。例如:数据文件data.sql,编码为UTF-8,使用如下命令:

    mysql -uroot -p --default-character-set=utf8 db < data.sql

这时不管数据使用的何种编码,都不会出现乱码的。当然如果你知道当前mysql客户端使用的默认编码和数据文件的编码集是一样的,那么可以省略上述编码设置。

mysqldump 存储过程

2012年3月14日 没有评论

mysqldump是mysql自带的一个备份数据库的工具,使用mysqldump可以很方便的把已有的数据库导出来,使用

mysqldump --help
如果MYSQL_HOME/bin没有加入PATH,需要指定去路径

可以看到有很多可选参数。

需要注意:默认情况下,mysqldump并不会导出数据库的存储过程和函数,如果数据库上创建了存储过程且备份是需要备份存储过程,那就需要用参数 -R 来指定,例如:

mysqldump -u root -p passwd -R testDB > db.sql

无觅相关文章插件,快速提升流量