mysql外键_boshding_新浪博客

昨天单位由一个网站,要放到万网的虚拟主机去。

网站是jsp写的,程序好导。直接ftp过去就可以了。

可是mysql的数据库怎么导呢?

我先用

mysqldump database_name>database_name.sql

然后把这个database_name.sql下载下来。

再给虚拟主机空间上传一个phpmyadmin来做数据库管理用。这样就可以使用phpmyadmin导入数据了。

如果网站数据小,这样就ok了。可是我的database_name.sql有60M

万网空间上的phpmyadmin只能{zd0}支持2M

于是只能另外想办法。我先导入表格结构吧。

mysqldump –d database_name>database_name.sql

在phpmyadmin里,选择好数据库后,用导入功能,将database_name.sql导入

现在有了表结构了,但是每个表都没有数据。我们再继续导入数据。

我的表里面,除了一个news表格特别大,大约51M,其他都在2M一下。所以我每个表格生成一个txt文件,然后导入到万网的数据库。

本地进入mysql>提示符后,用以下命令将数据的表格数据导出。

select * from admin into outfile “/tmp/admin.txt” fields terminated by “|” lines terminated by “@”;

上面命令将本地数据库的admin表,导出到/tmp/目录下的admin.txt文件。

我们有几个表格,就用这个命令导出几个txt文件。

然后将txt文件用gzip压缩,因为phpmyadmin支持gzip压缩格式的。

cd /tmp/

gzip admin.txt

{zh1}将压缩的admin.txt.gz下载到本地,用浏览器上传给phpmyadmin导入

解决news表格过大问题

 

 

我的news表格有51M,就算gzip压缩后,还有7M左右,还是不能用phpmyadmin导入。

我们可以将news表格的数据切分为多个txt文件,然后保证每个文件gzip后,在2M以内就可以。

这个切分就要根据具体表格来判断了。

我先查询了news表格一共有多少条记录

select count(*) from news;

返回1477条,表格是51M。压缩后的表格是7M。

7M/2M=3.5

1477/3.5=422条。

根据上面的计算,只要按照422条一个文件来分割就可以了。为了保险,因为每条记录的大小并不是一样的平均分配,我按照每个文件200条记录来切分。

select * from news where newId>0 limit 200 into outfile “/tmp/news0.txt” fields terminated by “|” lines terminated by “@”;

然后用

select max(newId) from news where newId>0 limit 200;

查看下200条记录后,是到了那条记录,下次分割就从那条开始

这样分割出来的8个文件,一次压缩后,上传到phpmyadmin导入。就完成了全部表格的导入工作。

总结

其实如果数据本身不复杂,直接用navicat也可以远程连接导入的。但是navicat不支持定义 lines terminated。我的news表格里面存在的都是html代码,经常出现换行符,所以只能选择用phpmyadmin了。

要想记录下提交到mysql数据库的全部sql语句,可以通过修改my.cnf来实现

修改/etc/my.cnf文件

找到

[mysqld]段

加入

log=queryLog
log-slow-queries=showquerylog

然后就可以到/var/lib/mysql/目录下找到queryLog和showquerylog日志文件了

里面记录这每个提交到数据库执行的sql语句。

我的系统CentOS 4.4 rpm方式安装的mysql 5.0.57,如果其它系统或者其它安装方式,可能文件路径会有些不同。

建立Mysql两个表间的外键,需要满足三个条件

1.两个表必须是InnoDB表类型

2.使用在外键关系的域必须为索引型(Index)

3.使用在外键关系的域必须与数据类型相似

下面举例说明

我们创建一个班级表和一个学生表,并建立一个外键

创建班级表

CREATE TABLE class (id INT NOT NULL AUTO_INCREMENT, classname VARCHAR(50) NOT NULL, PRIMARY KEY(id)) ENGINE=INNODB;

插入班级数据

INSERT INTO class VALUES (1,"一班"),(2,"二班"),(3,"三班");

创建学生表

CREATE TABLE students (id INT(4) NOT NULL, name VARCHAR(50) NOT NULL, FK_class INT(4) NOT NULL, INDEX (FK_class), FOREIGN KEY (FK_class) REFERENCES class (id), PRIMARY KEY(id)) ENGINE=INNODB;

验证外键约束性,我们向students表插入一个学生数据,并让FK_class的值为一个在class表里面不存在的值.

mysql> INSERT INTO students VALUES (1,"zhang",5);

马上就会看到Mysql报错
ERROR 1452 : Cannot add or update a child row: a foreign key constraint fails (`test/students`, CONSTRAINT `students_ibfk_1` FOREIGN KEY (`FK_class`) REFERENCES `class` (`id`))

以上证明外键可以正常工作了

在Mysql下测试了以下,不建立index,并且不指定innodb格式.

版本

+----------------------+
| version()             |
+----------------------+
| 5.0.24a-community-nt |
+----------------------+

建立class表

CREATE TABLE class (id INT NOT NULL AUTO_INCREMENT, classname VARCHAR(50) NOT NULL, PRIMARY KEY(id));

建立students表

CREATE TABLE students (id INT(4) NOT NULL, name VARCHAR(50) NOT NULL, FK_class INT(4) NOT NULL, FOREIGN KEY (FK_class) REFERENCES class (id), PRIMARY KEY(id));

通过Navicat查看,上面语句建立的两个表,也会默认用INNODB存储,而且也在students表建立了index和外键.一切正常.

已投稿到:
郑重声明:资讯 【mysql外键_boshding_新浪博客】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——