网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 
中国网管联盟
Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道
 当前位置: > bitsCN.com > 数据库技术 > 其它数据库 > 将你的网站从MySQL改为PostgreSQL  

将你的网站从MySQL改为PostgreSQL

2006-12-11  作者:bitsCN整理  来源:中国网管联盟  点评 投稿 收藏

  建立数据表

  当你使用SQL文件在Postgres中建立数据表时,请检查在每一个CREATE TABLE查询的最后是不是都以分号结束 - 这对于Postgres是不可省略的。使用telnet这样的工具连接到你的Web主机,然后用下面的方法建立数据表。 网管bitscn_com

  首先,用一个文本编辑器打开你的表定义文件。然后登录到你的主机,并输入psql运行Postgres交互终端。默认的用户论证方式是使用你的 telnet/FTP用户名作为你的Postgres帐号。这使得不需要你输入用户名和口令,Postgres就能自动鉴别你的身份。你的Web主机也许不是采用的这种方式,在这种情况下,你需要为psql程序带入参数:psql -d databasename -U username -W。-d用来指定数据库,-U指定用户名,而-W要求psql提示你输入一个口令。

网管朋友网www_bitscn_net

  当你成功地运行了psql以后,将每个CREATE TABLE查询单独地粘贴到psql中并按回车键。如果在你的SQL语句中有错误,psql会给出相应提示。通过逐一地加入每一个表,你会得到每一个表的调试信息,这样做起来相当简单。 网管u家u.bitsCN.com

  如果,在你输入了表的定义之后,你发现遗漏了一两个字段,有两种方法能解决这个问题。你可以使用ALTER TABLE命令,或者是使用DROP TABLE删除这张表,然后重新生成。如果你使用第二种方法,你会看到一个警告以验证你是不是真的想要删除表。 网管u家u.bitscn@com

  要使用DROP TABLE命令,只需要输入DROP TABLE practicetable;。这会删除我们刚才定义的表。但是当你对这个表重新进行定义时,你会发现一个错误。这是因为在删除一个表时并不相应地删除这个表中SERIAL类型字段的序列。这些遗留下来的序列会在你重建表时引起错误。要解决这个问题,你必须在删除表之前使用DROP SEQUENCE sequencename;删除相应的序列。而且有件很讨厌的事,那就是序列名并不就是SERIAL列的名字。当你定义一个SERIAL类型的字段时, Postgres会自动生成这样的序列名:tablename_colname_seq。在现在的这种情况下,DROP SEQUENCE 语句将会是这样的:DROP SEQUENCE practicetable_someID_seq;。现在你就可以删除这张表并重新生成它了。 网管u家www.bitscn.net

  在添加完这些表之后,你可以输入z对这些表进行复查。而输入q将会退出psql。现在剩下来的就是准备输入到Postgres中的数据了。 网管bitscn_com

  处理Dump文件 网管网www_bitscn_com

  因为MySQL保留了绝大多数的SQL语言的标准,从一个SQL的dump文件中导出实际数据并不是太困难的。然而,在我们使用Postgres对这个文件进行处理前,我们还是需要作一些编辑工作。

网管网www_bitscn_com

  对于数据记录,在MySQL和Postgres之间的主要区别是对引号的处理。在Postgres中,字符串变量(包含文本的变量)必须由两个单引号引出。而在MySQL中,你还可以使用双引号,但是幸运的是,在mysqldump程序中程序中使用的是单引号,这刚好与Postgres一致。然而, MySQL和Postgres还有一个地方不同,那就是对字符串中出现的引号的处理。在MySQL中使用\"\",而在Postgres中使用\"。使用你的文本编辑器并通过替换功能将其中所有的\"\"替换为\"。有趣的是,Postgres和MySQL都使用''来表示单引号,这使得我们免去了一个麻烦。

网管网www_bitscn_com

  导入到Postgres中

网管u家u.bitsCN.com

  当你整理好SQL dump文件后,将这个文件上载到你的Web主机中,就如同你当初建表那样登录到主机,转到SQL dump文件存放的目录。启动psql,不过这次你必须使用另一个命令行参数:psql -f sqldump.txt,这儿的sqldump.txt就改为你的SQL dump文件的文件名。这个命令会将全部的SQL文件导入到适当的Postgres数据表中。在此之前,你也许还需要其它的一些命令行参数以使得psql 可以对你的身份进行验证。如果发生了错误,psql会告诉这是由什么引起的。找到文件中的这一部分,找到问题并手工解决它。我当初是没有遇到任何问题,我差不多准备结束工作了。但是,很快我注意到另一个问题。 网管网www.bitscn.com

  在我开始使用我的新的Postgres驱动的站点时,我偶然地发现MySQL和Postgres之间另一个不兼容的地方。SERIAL类型的自增字段所使用的Postgres的序列,它从1开始,并在每次有一个SERIAL类型字段的记录插入时加一。然而,在我导入MySQL的dump文件时,这个 dump文件中的SQL将这个值定义为整型主键。我当时的情况是,我有一个到唯一主键已经到了60,而序列仍然是1。于是我的每一个插入命令都没法成功,因为根据序列产生的不是唯一ID。我当时用了一个很笨的方法解决这个问题,那就是运行了60次INSERT语句以将序列调整为适当的值,但是后来有一个熟悉Postgres的朋友教给我一个好方法。下面就是他所讲的方法: 网管朋友网www_bitscn_net

  使用telnet这样的终端程序连接到你的主机。然后启动psql程序。首先,确定表中ID的最大值。这可以用SELECT fieldname FROM tablename WHERE fieldname=MAX(fieldname);。然后使用DROP SEQUENCE table_colname_seq;删除有问题的序列,这儿table是表名,而colname是SERIAL字段的列名。然后使用CREATE SEQUENCE table_colname_seq START 61;重建序列,当然这儿的61应根据你的实际情况进行修改。 网管bitscn_com

  安装一个图形界面的工具

中国网管联盟bitsCN.com

  当我成功地将数据导入到Postgres后,我还需要让我的不懂Unix的伙伴能够操作数据库中的数据。当初的MySQL我是使用的 phpMyAdmin,这是一个很好用的工具,它能够在线的显示和编辑数据库。幸运的是,已经有了“Postgres版本”的phpMyAdmin,那就是phpPgAdmin。 网管论坛bbs_bitsCN_com

  phpPgAdmin的安装非常简单。首先,从phpPgAdmin网站下载最新的版本,然后将其放到你的Web主机上的你所能访问的地方。使用 telnet这样的工具登陆到主机。到phpPgAdmin.tar.gz文件所在的目录,输入tar -xzvf phpPgAdmin.tar.gz对程序进行解压(这里只是举个例子,你的文件名可能不一样)。下面一件事就是将解压生成的新的子目录移到合适的地方,并阅读README文件。

网管u家www.bitscn.net

  最后,用你的Web主机上的文本编辑器打开config.inc.php。这个文件中包含了对phpPgAdmin的配置。将这个文件配置好你就可以通过浏览器使用PhpPgAdmin了,它会提示你输入用户名并登录,通过这个程序你管理你的数据库将变得非常简单。

网管有家bitscn.net

  结语

网管朋友网www_bitscn_net

  与MySQL相比,Postgres更加稳定,更加可靠,可以应付更大的数据。按照上面的提示,你可以使用SQL的dump文件将数据从MySQL转到Postgres。如果在这个过程中你遇到什么困难,从Postgres网站你可以找到一些非常有用的文档资源。 网管u家u.bitscn@com

 

网管下载dl.bitscn.com

网管网www.bitscn.com

TAGs   改为   网站   Postgres   一个   MySQL   使用   可以   文件   这个      
 上一篇:ucLinux下sqlite数据库移植全攻略   下一篇:PostgreSQL 最新8.2版发布
将你的网站从MySQL改为PostgreSQL 评论:
loading.. 评论加载中…
评论:请自觉遵守互联网相关政策法规,评论不得超过250字。

验证码: 注册用户
本类热门排行:
最新推荐文章:
网管论坛交流: