mysql資料庫填報(資料庫建表總結)

本文目錄一覽:

資料庫mysql創建表格老是出錯,看不懂英文提示?

來自:51CTO(作者:superZS)

我在剛開始學習資料庫的時候,沒少走彎路。經常會遇到各種稀奇古怪的 error 信息,遇到報錯會很慌張,急需一個解決問題的辦法。跟無頭蒼蠅一樣,會不加思索地把錯誤粘到百度上,希望趕緊查找一下有沒有好的處理問題的方法。我想這個應該是剛從事資料庫的小白,都會遇到窘境。

今天就給大家列舉 MySQL 資料庫中,最經典的十大錯誤案例,並附有處理問題的解決思路和方法,希望能給剛入行,或資料庫愛好者一些幫助,今後再遇到任何報錯,我們都可以很淡定地去處理。

學習任何一門技術的同時,其實就是自我修鍊的過程。沉下心,嘗試去擁抱數據的世界!

Top 1:

Too many connections(連接數過多,導致連接不上資料庫,業務無法正常進行)

問題還原

解決問題的思路:

1、首先先要考慮在我們 MySQL 資料庫參數文件裡面,對應的 max_connections 這個參數值是不是設置的太小了,導致客戶端連接數超過了資料庫所承受的最大值。

● 該值默認大小是151,我們可以根據實際情況進行調整。

● 對應解決辦法:set global max_connections=500

但這樣調整會有隱患,因為我們無法確認資料庫是否可以承擔這麼大的連接壓力,就好比原來一個人只能吃一個饅頭,但現在卻非要讓他吃 10 個,他肯定接受不了。反應到伺服器上面,就有可能會出現宕機的可能。

所以這又反應出了,我們在新上線一個業務系統的時候,要做好壓力測試。保證後期對資料庫進行優化調整。

2、其次可以限制 Innodb 的並發處理數量,如果 innodb_thread_concurrency = 0(這種代表不受限制) 可以先改成 16或是64 看伺服器壓力。如果非常大,可以先改的小一點讓伺服器的壓力下來之後,然後再慢慢增大,根據自己的業務而定。個人建議可以先調整為 16 即可。

MySQL 隨著連接數的增加性能是會下降的,可以讓開發配合設置 thread pool,連接復用。在MySQL商業版中加入了thread pool這項功能

另外對於有的監控程序會讀取 information_schema 下面的表,可以考慮關閉下面的參數

innodb_stats_on_metadata=0

set global innodb_stats_on_metadata=0

Top 2:(主從複製報錯類型)

Last_SQL_Errno: 1062 (從庫與主庫數據衝突)

Last_Errno: 1062

Last_Error: Could not execute Write_rows event on table test.t;

Duplicate entry ‘4’ for key ‘PRIMARY’,

Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY;

the event’s master log mysql-bin.000014, end_log_pos 1505

針對這個報錯,我們首先要考慮是不是在從庫中誤操作導致的。結果發現,我們在從庫中進行了一條針對有主鍵表的 sql 語句的插入,導致主庫再插入相同 sql 的時候,主從狀態出現異常。發生主鍵衝突的報錯。

解決方法:

在確保主從數據一致性的前提下,可以在從庫進行錯誤跳過。一般使用 percona-toolkit 中的 pt-slave-restart 進行。

在從庫完成如下操作

[root@zs bin]# ./pt-slave-restart -uroot -proot123

2017-07-20T14:05:30 p=…,u=root node4-relay-bin.000002 1506 1062

之後最好在從庫中開啟 read_only 參數,禁止在從庫進行寫入操作

Last_IO_Errno: 1593(server-id衝突)

Last_IO_Error:

Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids;

these ids must be different for replication to work

(or the –replicate-same-server-id option must be used on slave but this

does not always make sense; please check the manual before using it)

這個報錯出現之後,就看一目了然看到兩台機器的 server-id 是一樣的。

在搭建主從複製的過程中,我們要確保兩台機器的 server-id 是唯一的。這裡再強調一下 server-id 的命名規則(伺服器 ip 地址的最後一位+本 MySQL 服務的埠號)

解決方法:

在主從兩台機器上設置不同的 server-id。

Last_SQL_Errno: 1032(從庫少數據,主庫更新的時候,從庫報錯)

Last_SQL_Error:

Could not execute Update_rows event on table test.t; Can’t find record

in ‘t’, Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the

event’s master log mysql-bin.000014, end_log_pos 1708

解決問題的辦法:

根據報錯信息,我們可以獲取到報錯日誌和position號,然後就能找到主庫執行的哪條sql,導致的主從報錯。

在主庫執行:

/usr/local/mysql/bin/mysqlbinlog –no-defaults -v -v –base64-output=decode-rows /data/mysql/mysql-bin.000014 |grep -A 10 1708 1.log

cat 1.log

#170720 14:20:15 server id 3 end_log_pos 1708 CRC32 0x97b6bdec Update_rows: table id 113 flags: STMT_END_F

### UPDATE `test`.`t`

### WHERE

### @1=4 /* INT meta=0 nullable=0 is_null=0 */

### @2=’dd’ /* VARSTRING(60) meta=60 nullable=1 is_null=0 */

### SET

### @1=4 /* INT meta=0 nullable=0 is_null=0 */

### @2=’ddd’ /* VARSTRING(60) meta=60 nullable=1 is_null=0 */

# at 1708

#170720 14:20:15 server id 3 end_log_pos 1739 CRC32 0xecaf1922 Xid = 654

COMMIT/*!*/;

DELIMITER ;

# End of log file

ROLLBACK /* added by mysqlbinlog */;

/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;

/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

獲取到 sql 語句之後,就可以在從庫反向執行 sql 語句。把從庫缺少的 sql 語句補全,解決報錯信息。

在從庫依次執行:

mysql insert into t (b) values (‘ddd’);

Query OK, 1 row affected (0.01 sec)

mysql stop slave;

Query OK, 0 rows affected (0.00 sec)

mysql exit

Bye

[root@node4 bin]# ./pt-slave-restart -uroot -proot123

2017-07-20T14:31:37 p=…,u=root node4-relay-bin.000005 283 1032

Top 3:MySQL安裝過程中的報錯

[root@zs data]# /usr/local/mysql/bin/mysqld_safe –defaults-file=/etc/my.cnf [1] 3758

[root@zs data]# 170720 14:41:24 mysqld_safe Logging to ‘/data/mysql/error.log’.

170720 14:41:24 mysqld_safe Starting mysqld daemon with databases from /data/mysql170720

14:41:25 mysqld_safe mysqld from pid file /data/mysql/node4.pid ended

170720 14:41:24 mysqld_safe Starting mysqld daemon with databases from /data/mysql2017-07-20

14:41:25 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated.

Please use –explicit_defaults_for_timestamp server option

(see documentation for more details)./usr/local/mysql/bin/mysqld:

File ‘/data/mysql/mysql-bin.index’ not found (Errcode: 13 – Permission denied)

2017-07-20 14:41:25 4388 [ERROR] Aborting

解決思路:

遇到這樣的報錯信息,我們要學會時時去關注錯誤日誌 error log 裡面的內容。看見了關鍵的報錯點 Permission denied。證明當前 MySQL 資料庫的數據目錄沒有許可權。

解決方法:

[root@zs data]# chown mysql:mysql -R mysql

[root@zs data]# /usr/local/mysql/bin/mysqld_safe –defaults-file=/etc/my.cnf

[1] 4402

[root@zs data]# 170720 14:45:56 mysqld_safe Logging to ‘/data/mysql/error.log’.

170720 14:45:56 mysqld_safe Starting mysqld daemon with databases from /data/mysql

啟動成功。

如何避免這類問題,個人建議在安裝 MySQL 初始化的時候,一定加上–user=mysql,這樣就可以避免許可權問題。

./mysql_install_db –basedir=/usr/local/mysql/ –datadir=/data/mysql/ –defaults-file=/etc/my.cnf –user=mysql

Top 4:資料庫密碼忘記的問題

[root@zs ~]# mysql -uroot -p

Enter password:

ERROR 1045 (28000): Access denied for user ‘root’@’localhost’ (using password: YES)

[root@zs ~]# mysql -uroot -p

Enter password:

ERROR 1045 (28000): Access denied for user ‘root’@’localhost’ (using password: YES)

我們有可能剛剛接手別人的 MySQL 資料庫,而且沒有完善的交接文檔。root 密碼可以丟失或者忘記了。

解決思路:

目前是進入不了資料庫的情況,所以我們要考慮是不是可以跳過許可權。因為在資料庫中,mysql資料庫中user表記錄著我們用戶的信息。

解決方法:

啟動 MySQL 資料庫的過程中,可以這樣執行:

/usr/local/mysql/bin/mysqld_safe –defaults-file=/etc/my.cnf –skip-grant-tables

這樣啟動,就可以不用輸入密碼,直接進入 mysql 資料庫了。然後在修改你自己想要改的root密碼即可。

update mysql.user set password=password(‘root123′) where user=’root’;

Top 5:truncate 刪除數據,導致自動清空自增ID,前端返回報錯 not found。

這個問題的出現,就要考慮下 truncate 和 delete 的區別了。

看下實驗演練:

首先先創建一張表;

CREATE TABLE `t` (

`a` int(11) NOT NULL AUTO_INCREMENT,

`b` varchar(20) DEFAULT NULL,

PRIMARY KEY (`a`),

KEY `b` (`b`)

) ENGINE=InnoDB AUTO_INCREMENT=300 DEFAULT CHARSET=utf8

插入三條數據:

mysql insert into t (b) values (‘aa’);

Query OK, 1 row affected (0.00 sec)

mysql insert into t (b) values (‘bb’);

Query OK, 1 row affected (0.00 sec)

mysql insert into t (b) values (‘cc’);

Query OK, 1 row affected (0.00 sec)

mysql select * from t;

+—–+——+

| a | b |

+—–+——+

| 300 | aa |

| 301 | bb |

| 302 | cc |

+—–+——+

3 rows in set (0.00 sec)

先用 delete 進行刪除全表信息,再插入新值。

結果發現 truncate 把自增初始值重置了,自增屬性從1開始記錄了。當前端用主鍵id進行查詢時,就會報沒有這條數據的錯誤。

個人建議不要使用 truncate 對錶進行刪除操作,雖然可以回收表空間,但是會涉及自增屬性問題。這些坑,我們不要輕易鑽進去。

Top 6:

阿里雲 MySQL 的配置文件中,需要注意一個參數設置就是:

lower_case_table_names = 0;默認情況

lower_case_table_names = 1;是不區分大小寫 . 如果報你小寫的表名找不到, 那你就把遠端資料庫的表名改成小寫 , 反之亦然 . 注意 Mybatis 的 Mapper 文件的所有表名也要相應修改

Top 7:

有同學經常會問張老師,為什麼我的資料庫總會出現中文亂碼的情況。一堆????不知道怎麼回事。當向資料庫中寫入創建表,並插入中文時,會出現這種問題。此報錯會涉及資料庫字符集的問題。

解決思路:

對於中文亂碼的情況,記住老師告訴你的三個統一就可以。還要知道在目前的mysql資料庫中字符集編碼都是默認的UTF8

處理辦法:

1、數據終端,也就是我們連接資料庫的工具設置為 utf8

2、操作系統層面;可以通過 cat /etc/sysconfig/i18n 查看;也要設置為 utf8

3、資料庫層面;在參數文件中的 mysqld 下,加入 character-set-server=utf8。

Emoji 表情符號錄入 mysql 資料庫中報錯。

Caused by: java.sql.SQLException: Incorrect string value: ‘\xF0\x9F\x98\x97\xF0\x9F…’ for column ‘CONTENT’ at row 1

at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074)

at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4096)

at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4028)

at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2490)

at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651)

at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2734)

at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)

at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1379)

解決思路:針對錶情插入的問題,一定還是字符集的問題。

處理方法:我們可以直接在參數文件中,加入

vim /etc/my.cnf

[mysqld]

init-connect=’SET NAMES utf8mb4′

character-set-server=utf8mb4

註:utf8mb4 是 utf8 的超集。

Top 8:使用 binlog_format=statement 這種格式,跨庫操作,導致從庫丟失數據,用戶訪問導致出現錯誤數據信息。

當前資料庫二進位日誌的格式為:binlog_format=statement

在主庫設置binlog-do-db=mydb1(只同步mydb1這一個庫)

在主庫執行use mydb2;

insert into mydb1.t1 values (‘bb’);這條語句不會同步到從庫。

但是這樣操作就可以;

use mydb1;

insert into mydb1.t1 values (‘bb’);因為這是在同一個庫中完成的操作。

在生產環境中建議使用binlog的格式為row,而且慎用binlog-do-db參數。

Top 9:MySQL 資料庫連接超時的報錯 ;

org.hibernate.util.JDBCExceptionReporter – SQL Error:0, SQLState: 08S01

org.hibernate.util.JDBCExceptionReporter – The last packet successfully received from the server was43200 milliseconds ago.The last packet sent successfully to the server was 43200 milliseconds ago, which is longer than the server configured value of ‘wait_timeout’. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection ‘autoReconnect=true’ to avoid this problem.

org.hibernate.event.def.AbstractFlushingEventListener – Could not synchronize database state with session

org.hibernate.exception.JDBCConnectionException: Could not execute JDBC batch update

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Connection.close() has already been called. Invalid operation in this state.

org.hibernate.util.JDBCExceptionReporter – SQL Error:0, SQLState: 08003

org.hibernate.util.JDBCExceptionReporter – No operations allowed after connection closed. Connection was implicitly closed due to underlying exception/error:

** BEGIN NESTED EXCEPTION **

大多數做 DBA 的同學,可能都會被開發人員告知,你們的資料庫報了這個錯誤了。趕緊看看是哪裡的問題。

這個問題是由兩個參數影響的,wait_timeout 和 interactive_timeout。數據默認的配置時間是28800(8小時)意味著,超過這個時間之後,MySQL 資料庫為了節省資源,就會在資料庫端斷開這個連接,Mysql伺服器端將其斷開了,但是我們的程序再次使用這個連接時沒有做任何判斷,所以就掛了。

解決思路:

先要了解這兩個參數的特性;這兩個參數必須同時設置,而且必須要保證值一致才可以。

我們可以適當加大這個值,8小時太長了,不適用於生產環境。因為一個連接長時間不工作,還佔用我們的連接數,會消耗我們的系統資源。

解決方法:

可以適當在程序中做判斷;強烈建議在操作結束時更改應用程序邏輯以正確關閉連接;然後設置一個比較合理的timeout的值(根據業務情況來判斷)

Top 10 :can’t open file (errno:24)

有的時候,資料庫跑得好好的,突然報不能打開資料庫文件的錯誤了。

解決思路:

首先我們要先查看資料庫的 error log。然後判斷是表損壞,還是許可權問題。還有可能磁碟空間不足導致的不能正常訪問表;操作系統的限制也要關注下;用 perror 工具查看具體錯誤!

linux:/usr/local/mysql/bin # ./perror 24

OS error code 24: Too many open files

超出最大打開文件數限制!ulimit -n查看系統的最大打開文件數是65535,不可能超出!那必然是資料庫的最大打開文件數超出限制!

在 MySQL 里查看最大打開文件數限制命令:show variables like ‘open_files_limit’;

發現該數值過小,改為2048,重啟 MySQL,應用正常

處理方法:

repair table ;

chown mysql許可權

清理磁碟中的垃圾數據

mysql 建資料庫用什麼字符集

mysql創建資料庫一般使用的字符集為UTF-8,但具體的要根據實際情況進行選擇。

工具:mysql5.6,Navicat Premium

步驟:

1、打開Navicat Premium,雙擊左側伺服器的樹形結構,連接到伺服器,這裡以localhost為例。

2、在localhost處點右鍵,選擇「新建資料庫」。

3、彈出窗口中,填寫新建的資料庫名字,這裡填寫的是「badkano」,然後選擇字符集,下拉列表,選擇UTF-8,排序規則可不填,然後點「確定」按鈕。

4、由圖可見,badkano資料庫創建成功。

如何向Mysql資料庫的表中錄入數據

insert into tablename values(value1,value2,…)insert into tablename(fieldname1,fieldname2,…) values(value1,value2,…)insert into tablename(fieldname1,fieldname2) select fieldname1,fieldname2 from tablename1以上基本上羅列了用insert插入數據的方法,當然你也可以用insert語句將幾行同時插入到一個表中.如下所示:2.在mysql運行環境下,我們還可以用LOAD DATA 語句把文件裡面的數據讀取錄入到表裡面.一般來講,因為此文件是由伺服器在主機上直接讀取的.所以你必須具有file許可權且文件必須是完全可讀.當你版本夠新的話,你可以給出local,這樣由於你是從客戶機上讀取該文件並將內容傳送到伺服器,你就不需要file許可權.如果你沒有給出local,則伺服器按如下方法對其進行定位:1)如果你的filename為絕對路徑,則伺服器從根目錄開始查找該文件.2)如果你的filename為相對路徑,則伺服器從資料庫的數據目錄中開始查找該文件.如果你給出了local,則文件將按以下方式進行定位:1)如果你的filename為絕對路徑,則客戶機從根目錄開始查找該文件.2)如果你的filename為相對路徑,則客戶機從當前目錄開始查找該文件.說了半天,也許你還不明白這具體的格式,看下面先:LOAD DATA [LOCAL] INFILE ‘filename’ into table tablename import_options [(fieldname_list)]import options的語法為:fieldsterminated by ‘char’enclosed by ‘char’escaped by ‘char’linesterminated by ‘string’下面我們對其進行一些說明:1)fields terminated by char 指定分隔列的字元.預設時假定列值由製表符分隔.2)fields enclosed by char 指明列值應包括在指定的字元中.通常用引號.預設時,假定列值不包括在任何字元中.3)fields escaped by char 表示用於轉義特殊字元的轉義符.預設時表示無轉義符4)lindes escaped by string 指定結束輸入行的串(可以是多字元的).預設時假定由換行符終止行需要注意的是轉義字元的使用. 如:\’ 表示單引號,\” 表示雙引號 等等.另外還有一些選項這裡沒有具體談到,如 ignore n lines 她可以控制文件的前n行不被讀入資料庫.詳細請看mysql中文參考.說了上面這麼多,給一行命令大家具體體會一下:load data [local] infile “sample.txt” into table sample fields terminated by “,” enclosed by “\””3.在系統命令行下你可以用mysqlimport實用程序,她將文本文件的內容讀取到已有表中(其實mysqlimport起的作用就是實現load data命令行的介面),調用完mysqlimport後她生成一個load data 語句.語法基本上和load data差不多:mysqlimport [options] sample_db filename同樣,給條命令看一下吧:

怎麼在MYSQL里創建自己的資料庫.txt

MySQL資料庫系統可以支持許多不同的資料庫,通常,每個應用程序需要一個資料庫。

在Book-O-Rama例子中,資料庫名為books。

創建資料庫是最容易的部分。在mySQL命令提示符下,輸入如下所示命令:

MySQLcreate datebase dbname;

應該用所希望的資料庫名稱來代替”dbname”字元串。

在Book-O-Rama例子中,要創建一個名為books的資料庫。

就這樣應該會看到如下所示的響應(執行時間會因為機器不同而不同):

Query ok,1 row affected(0.0 sec)

如果出現上訴欄位意味著一切正常。

如果沒有得到響應,請確認在上面的命令行後面輸入分號,分號將告訴mySQL已經完成了命令輸入,該執行命令了。

如何用MySQL命令對資料庫進行導出/導入/技巧

info:

1.txt

zhangsan wuhan

lishi wuhan

把1.txt文件插入到mysql資料庫中

1.mysql -u root -p 資料庫名 /文件路徑(在bin下就直接加文件名)

2.mysqlimport的語法介紹:

mysqlimport位於mysql/bin目錄中,是mysql的一個載入(或者說導入)數據的一個非常有效的工具。這是一個命令行工具。有兩個參數以及大量的選項可供選擇。這個工具把一個文本文件(text file)導入到你指定的資料庫和表中。比方說我們要從文件Customers.txt中把數據導入到資料庫Meet_A_Geek中的表 Custermers中:

mysqlimport Meet_A_Geek Customers.txt

注意:這裡Customers.txt是我們要導入數據的文本文件,而Meet_A_Geek是我們要操作的資料庫,資料庫中的表名是Customers,這裡文本文件的數據格式必須與Customers表中的記錄格式一致,否則mysqlimport命令將會出錯。

其中表的名字是導入文件的第一個句號(.)前面文件字元串,另外一個例子:

mysqlimport Meet_A_Geek Cus.to.mers.txt

那麼我們將把文件中的內容導入到資料庫Meet_A_Geek 中的Cus表中。上面的例子中,都只用到兩個參數,並沒有用到更多的選項,下面介紹mysqlimport的選項:

選項 功能

-d or –delete 新數據導入數據表中之前刪除數據數據表中的所有信息

-f or –force 不管是否遇到錯誤,mysqlimport將強制繼續插入數據

-i or –ignore mysqlimport跳過或者忽略那些有相同唯一關鍵字的行, 導入文件中的數據將被忽略。

-l or -lock-tables 數據被插入之前鎖住表,這樣就防止了,你在更新資料庫時,用戶的查詢和更新受到影響。

-r or -replace 這個選項與-i選項的作用相反;此選項將替代表中有相同唯一關鍵字的記錄。

–fields-enclosed- by= char 指定文本文件中數據的記錄時以什麼括起的, 很多情況下數據以雙引號括起。 默認的情況下數據是沒有被字元括起的。

–fields-terminated- by=char 指定各個數據的值之間的分隔符,在句號分隔的文件中,分隔符是句號。您可以用此選項指定數據之間的分隔符。默認的分隔符是跳格符(Tab)

–lines-terminated- by=str 此選項指定文本文件中行與行之間數據的分隔字元串或者字元。 默認的情況下mysqlimport以newline為行分隔符。您可以選擇用一個字元串來替代一個單個的字元:一個新行或者一個回車。

mysqlimport命令常用的選項還有-v 顯示版本(version), -p 提示輸入密碼(password)等。

例子:導入一個以逗號為分隔符的文件文件中行的記錄格式是這樣的:

“1”, “ORD89876”, “1 Dozen Roses”, “19991226”

我們的任務是要把這個文件裡面的數據導入到資料庫Meet_A_Geek中的表格Orders中,我們使用這個命令:

bin/mysqlimport –prl –fields-enclosed-by=” –fields-terminated-by=, Meet_A_Geek Orders.txt

3.mysql資料庫常用導出導入命令的幾個用例

================================

幾個常用用例:

1.導出整個資料庫

mysqldump -u 用戶名 -p 資料庫名 導出的文件名

mysqldump -u wcnc -p smgp_apps_wcnc wcnc.sql

2.導出一個表

mysqldump -u 用戶名 -p 資料庫名 表名 導出的文件名

mysqldump -u wcnc -p smgp_apps_wcnc users wcnc_users.sql

3.導出一個資料庫結構

mysqldump -u wcnc -p -d –add-drop-table smgp_apps_wcnc d:\wcnc_db.sql

-d 沒有數據 –add-drop-table 在每個create語句之前增加一個drop table

4.導入資料庫

常用source 命令

進入mysql資料庫控制台,

如mysql -u root -p

mysqluse 資料庫

然後使用source命令,後面參數為腳本文件(如這裡用到的.sql)

mysqlsource d:\wcnc_db.sql

4.可參看 MySQL數據的導出和導入工具:mysqldump

====================================

批處理是一種非互動式運行mysql程序的方法,如同您在mysql中使用的命令一樣,你仍然將使用這些命令。為了實現批處理,您重定向一個文件到 mysql程序中,首先我們需要一個文本文件,這個文本文件包含有與我們在mysql中輸入的命令相同的文本。比如我們要插入一些數據,使用包含下面文本的文件(文件名為New_Data.sql,當然我們也可以取名為New_Data.txt及任何其他的合法名字,並不一定要以後綴sql結尾):

USE Meet_A_Geek;

INSERT INTO Customers (Customer_ID, Last_Name) VALUES(NULL, “Block”);

INSERT INTO Customers (Customer_ID, Last_Name) VALUES(NULL, “Newton”);

INSERT INTO Customers (Customer_ID, Last_Name) VALUES(NULL, “Simmons”);

注意上面的這些句子的語法都必須是正確的,並且每個句子以分號結束。上面的USE命令選擇資料庫,INSERT命令插入數據。

下面我們要把上面的文件導入到資料庫中,導入之前要確認資料庫已經在運行,即是mysqld進程(或者說服務,Windows NT下面稱為」服務「,unix下面為」進程「)已經在運行。然後運行下面的命令:

bin/mysql –p /home/mark/New_Data.sql

接著按提示輸入密碼,如果上面的文件中的語句沒有錯誤,那麼這些數據就被導入到了資料庫中。

命令行中使用LOAD DATA INFILE 從文件中導入數據到資料庫:

現在您可能會問自己,”究竟為什麼我要輸入所有的這些SQL語句到文件中,然後通過程序運行它們呢?」這樣看起來好像需要大量的工作。很好,你這樣想很可能就對了。但是假如你有從所有這些命令中產生的log記錄呢?現在這樣就很棒,嗯,大多數資料庫都會自動產生資料庫中的事件記錄的log。而大部分log 都包含有用過的原始的SQL命令。因此,如果您不能從您現在的資料庫中導出數據到新的mysql資料庫中使用,那麼您可以使用log和mysql的批處理特性,來快速且方便地導入您地數據。當然,這樣就省去了打字的麻煩。

LOAD DATA INFILE

這是我們要介紹的最後一個導入數據到MySQL資料庫中的方法。這個命令與mysqlimport非常相似,但這個方法可以在mysql命令行中使用。也就是說您可以在所有使用API的程序中使用這個命令。使用這種方法,您就可以在應用程序中導入您想要導入的數據。

使用這個命令之前,mysqld進程(服務)必須已經在運行。啟動mysql命令行:

bin/mysql –p

按提示輸入密碼,成功進入mysql命令行之後,輸入下面的命令:

USE Meet_A_Geek;

LOAD DATA INFILE “/home/mark/data.sql” INTO TABLE Orders;

簡單的講,這樣將會把文件data.sql中的內容導入到表Orders中,如mysqlimport工具一樣,這個命令也有一些可以選擇的參數。比如您需要把自己的電腦上的數據導入到遠程的資料庫伺服器中,您可以使用下面的命令:

LOAD DATA LOCAL INFILE “C:\MyDocs\SQL.txt” INTO TABLE Orders;

上面的LOCAL參數表示文件是本地的文件,伺服器是您所登陸的伺服器。這樣就省去了使用ftp來上傳文件到伺服器,MySQL替你完成了.

您也可以設置插入語句的優先順序,如果您要把它標記為低優先順序(LOW_PRIORITY),那麼MySQL將會等到沒有其他人讀這個表的時候,才把插入數據。可以使用如下的命令:

LOAD DATA LOW_PRIORITY INFILE “/home/mark/data.sql” INTO TABLE Orders;

您也可以指定是否在插入數據的時候,取代或者忽略文件與數據表中重複的鍵值。替代重複的鍵值的語法:

LOAD DATA LOW_PRIORITY INFILE “/home/mark/data.sql” REPLACE INTO TABLE Orders;

上面的句子看起來有點笨拙,但卻把關鍵字放在了讓您的剖析器可以理解的地方。

下面的一對選項描述了文件的記錄格式,這些選項也是在mysqlimport工具中可以用的。他們在這裡看起來有點不同。首先,要用到FIELDS關鍵字,如果用到這個關鍵字,MySQL剖析器希望看到至少有下面的一個選項:

TERMINATED BY character

ENCLOSED BY character

ESCAPED BY character

這些關鍵字與它們的參數跟mysqlimport中的用法是一樣的. The

TERMINATED BY 描述欄位的分隔符,默認情況下是tab字元(\t)

ENCLOSED BY描述的是欄位的括起字元。比方以引號括起每一個欄位。

ESCAPED BY 描述的轉義字元。默認的是反些杠(backslash:\ ).

下面仍然使用前面的mysqlimport命令的例子,用LOAD DATA INFILE語句把同樣的文件導入到資料庫中:

LOAD DATA INFILE “/home/mark/Orders.txt” REPLACE INTO TABLE Orders FIELDS TERMINATED BY ‘,’

ENCLOSED BY ‘”‘;

LOAD DATA INFILE語句中有一個mysqlimport工具中沒有特點:LOAD DATA INFILE 可以按指定的列把文件導入到資料庫中。

當我們要把數據的一部分內容導入的時候,這個特點就很重要。比方說,我們要從Access資料庫升級到MySQL資料庫的時候,需要加入一些欄目(列/欄位 /field)到MySQL資料庫中,以適應一些額外的需要。這個時候,我們的Access資料庫中的數據仍然是可用的,但是因為這些數據的欄目 (field)與MySQL中的不再匹配,因此而無法再使用mysqlimport工具。儘管如此,我們仍然可以使用LOAD DATA INFILE,下面的例子顯示了如何向指定的欄目(field)中導入數據:

LOAD DATA INFILE “/home/Order.txt” INTO TABLE Orders(Order_Number, Order_Date, Customer_ID);

如您所見,我們可以指定需要的欄目(fields)。這些指定的欄位依然是以括弧括起,由逗號分隔的,如果您遺漏了其中任何一個,MySQL將會提醒您^_^ 。

原創文章,作者:簡單一點,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/127822.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
簡單一點的頭像簡單一點
上一篇 2024-10-03 23:16
下一篇 2024-10-03 23:16

相關推薦

  • 如何修改mysql的埠號

    本文將介紹如何修改mysql的埠號,方便開發者根據實際需求配置對應埠號。 一、為什麼需要修改mysql埠號 默認情況下,mysql使用的埠號是3306。在某些情況下,我們需…

    編程 2025-04-29
  • Python 常用資料庫有哪些?

    在Python編程中,資料庫是不可或缺的一部分。隨著互聯網應用的不斷擴大,處理海量數據已成為一種趨勢。Python有許多成熟的資料庫管理系統,接下來我們將從多個方面介紹Python…

    編程 2025-04-29
  • openeuler安裝資料庫方案

    本文將介紹在openeuler操作系統中安裝資料庫的方案,並提供代碼示例。 一、安裝MariaDB 下面介紹如何在openeuler中安裝MariaDB。 1、更新軟體源 sudo…

    編程 2025-04-29
  • Python操作MySQL

    本文將從以下幾個方面對Python操作MySQL進行詳細闡述: 一、連接MySQL資料庫 在使用Python操作MySQL之前,我們需要先連接MySQL資料庫。在Python中,我…

    編程 2025-04-29
  • 資料庫第三範式會有刪除插入異常

    如果沒有正確設計資料庫,第三範式可能導致刪除和插入異常。以下是詳細解釋: 一、什麼是第三範式和範式理論? 範式理論是關係資料庫中的一個規範化過程。第三範式是範式理論中的一種常見形式…

    編程 2025-04-29
  • MySQL遞歸函數的用法

    本文將從多個方面對MySQL遞歸函數的用法做詳細的闡述,包括函數的定義、使用方法、示例及注意事項。 一、遞歸函數的定義 遞歸函數是指在函數內部調用自身的函數。MySQL提供了CRE…

    編程 2025-04-29
  • leveldb和unqlite:兩個高性能的資料庫存儲引擎

    本文將介紹兩款高性能的資料庫存儲引擎:leveldb和unqlite,並從多個方面對它們進行詳細的闡述。 一、leveldb:輕量級的鍵值存儲引擎 1、leveldb概述: lev…

    編程 2025-04-28
  • MySQL bigint與long的區別

    本文將從數據類型定義、存儲空間、數據範圍、計算效率、應用場景五個方面詳細闡述MySQL bigint與long的區別。 一、數據類型定義 bigint在MySQL中是一種有符號的整…

    編程 2025-04-28
  • Python怎麼導入資料庫

    Python是一種高級編程語言。它具有簡單、易讀的語法和廣泛的庫,讓它成為一個靈活和強大的工具。Python的資料庫連接類型可以多種多樣,其中包括MySQL、Oracle、Post…

    編程 2025-04-28
  • MySQL左連接索引不生效問題解決

    在MySQL資料庫中,經常會使用左連接查詢操作,但是左連接查詢中索引不生效的情況也比較常見。本文將從多個方面探討MySQL左連接索引不生效問題,並給出相應的解決方法。 一、索引的作…

    編程 2025-04-28

發表回復

登錄後才能評論