mysql數據庫的備份以及表格數據之間的復制
#####-------------mysql數據備份以及表間數據的復制-------------------#####
----------------我的mysql學習(二)--------------------------###
mysql數據的導入和導出--這里承接上一部分
導出全部數據庫該操作在mysql命令行外進行:
導出數據格式如下:</p>
mysqldump -hlocalhost -uroot -p databasename tablename > filename.sql
由于數據庫在本機上所有可以省略-hlocalhost
預輸入sql命令:
mysqldump -uroot -p --default-character-set=gbk mydb > E:\mydb.sql
彈出輸入密碼提示,輸入密碼即可導出數據庫。.sql文件中不包含創建數據庫的語句
有的僅僅是對表的操作。</p>
C:\Users\trsli>mysqldump -uroot -p --default-character-set=gbk mydb > E:\myd
b.sql
Enter password: **
導出成功數據庫,我們將數據庫重新導入MySQL中,實現方法如下所示:
首先需要重新建立一個數據庫,或者用已經存在的數據庫,這里新建一數據庫:
create database mydb1 default character set gbk;
然后進行如下操作導入數據庫:
C:\Users\trsli>mysql -uroot -p mydb1 < E:\mydb.sql
Enter password: **
或者在mydb1下直接用如下命令:
source E:\mydb.sql
兩種方式效果一樣,現在檢查mydb1中是否存在該表已經表中是否有數據。</p>
mysql> use mydb1;
Database changed
mysql> show tables;
+-----------------+
| Tables_in_mydb1 |
+-----------------+
| mytable |
+-----------------+
1 row in set (0.00 sec)
mysql> select * from mytables;
+----+--------+-------+
| id | name | count |
+----+--------+-------+
| 1 | 張三 | 1000 |
| 2 | 李四 | 500 |
| 3 | 王老虎 | 100 |
| 4 | 趙大 | 1000 |
| 5 | 王二小 | 500 |
| 6 | 三亞子 | 100 |
+----+--------+-------+
6 rows in set (0.00 sec)
該數據與數據庫mydb數據庫中顯示一致。
在數據庫眾多的表中,如果我們只需要導出某一張表格,那么我們可以進行如下操作:
mysqldump -uroot -p mydb1 mytable > E:\mydb1.sql</p>
C:\Users\trsli>mysqldump -uroot -p mydb1 mytable > E:\mydb1.sql
Enter password: ****
#在導出數據過程中有一些參數如:-d --add-drop-table,這里看一下有什么效果:
這里只添加-d:</p>
C:\Users\trsli>mysqldump -uroot -p -d mydb1 mytable > E:\mydb2.sql
Enter password: **
在導出的文件中會少了插入數據的sql語句,只有創建表的sql語句存在。
##########------>.sql文件中德語句
LOCK TABLES mytable
WRITE;
/!40000 ALTER TABLE mytable
DISABLE KEYS /;
INSERT INTO mytable
VALUES (1,'張三',1000),(2,'李四',500),(3,'王老虎',100)
,(4,'趙大',1000),(5,'王二小',500),(6,'三亞子',100);
/!40000 ALTER TABLE mytable
ENABLE KEYS /;
UNLOCK TABLES;
##########----->該區域sql語句將不會顯示</p>
#下面添加--add-drop -table語句:
C:\Users\trsli>mysqldump -uroot -p --add-drop-table mydb1 mytable > E:\mydb3
.sql
Enter password: **
該結果與未添加差不多,也許個人觀察不夠仔細。
最后同時添加:-d --add-drop-table查看效果</p>
C:\Users\liyuanjie>mysqldump -uroot -p -d --add-drop-table mydb mytable > E:\myd
b3.sql
Enter password: **
該效果與只添加-d一致
-----------------以上方式可用于數據庫備份----------------####</p>
####-----------------以下是批量添加表數據的操作--------------####
這些在網上都有現成的范例,但是我覺得只有自己親手做過才能算是真的明白所以有了以下的操作
這里要做的就是關于表中數據的復制,上面我們介紹過通過.txt文本添加數據,這里介紹表格間復制數據:
現在創建一個新的表:mytab</p>
mysql> create table mytab(
-> id int primary key auto_increment,
-> name varchar(20) not null,
-> age int not null,
-> salary int not null
-> )type=InnoDB;
Query OK, 0 rows affected, 1 warning (0.07 sec)
#給該表添加4個字段
這里用前面介紹的文件導入數據方式向空表mytab中添加數據
load data local infile 'E:\mydb.txt' into table mytab(name,salary,age);</p>
mysql> load data local infile 'E:\mydb.txt' into table mytab(name,salary,age);
Query OK, 3 rows affected (0.06 sec)
Records: 3 Deleted: 0 Skipped: 0 Warnings: 0
mysql> select * from mytab;
+----+--------+-----+--------+
| id | name | age | salary |
+----+--------+-----+--------+
| 1 | ?阿瓊 | 23 | 1000 |
| 2 | 秋水蝦 | 24 | 500 |
| 3 | 害人精 | 22 | 100 |
+----+--------+-----+--------+
3 rows in set (0.01 sec)
#如何將mytab中的數據復制到mytable中,就是我們下面需要做的。mytable中數據如最上邊所示:
insert into mytable (name,count) select name,salary from mytab ;</p>
mysql> select * from mytable;
+----+--------+-------+
| id | name | count |
+----+--------+-------+
| 1 | 張三 | 1000 |
| 2 | 李四 | 500 |
| 3 | 王老虎 | 100 |
| 4 | 趙大 | 1000 |
| 5 | 王二小 | 500 |
| 6 | 三亞子 | 100 |
| 7 | ?阿瓊 | 1000 |
| 8 | 秋水蝦 | 500 |
| 9 | 害人精 | 100 |
+----+--------+-------+
9 rows in set (0.00 sec)
可以看到數據以及增加了三行,即將全表導入</p>
#進行不重復插入數據操作:
這里先刪除最后一條數據:
delete from mytable where id=9;</p>
mysql> delete from mytable where id=9;
Query OK, 1 row affected (0.10 sec)
按照預期應該只會插入一條語句,看一下是不是如此呢,下面我們先寫一個sql的草稿:
insert into mytable(name,count) select name,salary from mytab where not exists (select * from mytable where name=mytab.name);
上面的語句就是將重名的剔除,添加非重名數據</p>
mysql> insert into mytable(name,count) select name,salary from mytab where not e
xists (select * from mytable where name=mytab.name);
Query OK, 1 row affected (0.06 sec) #影響一行數據
Records: 1 Duplicates: 0 Warnings: 0
#小注:在這里我用了較長時間才寫好該sql語句,沒辦法,略顯不專業哈。