MySQL中insert語句的使用與優(yōu)化教程
MySQL 表中使用 INSERT INTO SQL語句來插入數(shù)據(jù)。
你可以通過 mysql> 命令提示窗口中向數(shù)據(jù)表中插入數(shù)據(jù),或者通過PHP腳本來插入數(shù)據(jù)。
語法
以下為向MySQL數(shù)據(jù)表插入數(shù)據(jù)通用的 INSERT INTO SQL語法:
INSERT INTO table_name ( field1, field2,...fieldN ) VALUES ( value1, value2,...valueN );
如果數(shù)據(jù)是字符型,必須使用單引號(hào)或者雙引號(hào),如:"value"。
通過命令提示窗口插入數(shù)據(jù)
以下我們將使用 SQL INSERT INTO 語句向 MySQL 數(shù)據(jù)表 runoob_tbl 插入數(shù)據(jù)
實(shí)例
以下實(shí)例中我們將想 runoob_tbl 表插入三條數(shù)據(jù):
root@host# mysql -u root -p password; Enter password:******* mysql> use RUNOOB; Database changed mysql> INSERT INTO runoob_tbl ->(runoob_title, runoob_author, submission_date) ->VALUES ->("Learn PHP", "John Poul", NOW()); Query OK, 1 row affected (0.01 sec) mysql> INSERT INTO runoob_tbl ->(runoob_title, runoob_author, submission_date) ->VALUES ->("Learn MySQL", "Abdul S", NOW()); Query OK, 1 row affected (0.01 sec) mysql> INSERT INTO runoob_tbl ->(runoob_title, runoob_author, submission_date) ->VALUES ->("JAVA Tutorial", "Sanjay", '2007-05-06'); Query OK, 1 row affected (0.01 sec) mysql>
注意: 使用箭頭標(biāo)記(->)不是SQL語句的一部分,它僅僅表示一個(gè)新行,如果一條SQL語句太長(zhǎng),我們可以通過回車鍵來創(chuàng)建一個(gè)新行來編寫SQL語句,SQL語句的命令結(jié)束符為分號(hào)(;)。
在以上實(shí)例中,我們并沒有提供 runoob_id 的數(shù)據(jù),因?yàn)樵撟侄挝覀冊(cè)趧?chuàng)建表的時(shí)候已經(jīng)設(shè)置它為 AUTO_INCREMENT(自動(dòng)增加) 屬性。 所以,該字段會(huì)自動(dòng)遞增而不需要我們?nèi)ピO(shè)置。實(shí)例中 NOW() 是一個(gè) MySQL 函數(shù),該函數(shù)返回日期和時(shí)間。
使用PHP腳本插入數(shù)據(jù)
你可以使用PHP 的 mysql_query() 函數(shù)來執(zhí)行 SQL INSERT INTO命令來插入數(shù)據(jù)。
該函數(shù)有兩個(gè)參數(shù),在執(zhí)行成功時(shí)返回 TRUE,否則返回 FALSE。
語法
bool mysql_query( sql, connection );
參數(shù):
sql:必需,規(guī)定要發(fā)送的 SQL 查詢,注意、查詢字符串不應(yīng)以分號(hào)結(jié)束。
connection:可選,規(guī)定 SQL 連接標(biāo)識(shí)符,如果未規(guī)定,則使用上一個(gè)打開的連接。
實(shí)例
以下實(shí)例中程序接收用戶輸入的三個(gè)字段數(shù)據(jù),并插入數(shù)據(jù)表中:
<html> <head> <title>向 MySQL 數(shù)據(jù)庫添加數(shù)據(jù)</title> </head> <body> <?php if(isset($_POST['add'])) { $dbhost = 'localhost:3036'; $dbuser = 'root'; $dbpass = 'rootpassword'; $conn = mysql_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('Could not connect: ' . mysql_error()); } if(! get_magic_quotes_gpc() ) { $runoob_title = addslashes ($_POST['runoob_title']); $runoob_author = addslashes ($_POST['runoob_author']); } else { $runoob_title = $_POST['runoob_title']; $runoob_author = $_POST['runoob_author']; } $submission_date = $_POST['submission_date']; $sql = "INSERT INTO runoob_tbl ". "(runoob_title,runoob_author, submission_date) ". "VALUES ". "('$runoob_title','$runoob_author','$submission_date')"; mysql_select_db('RUNOOB'); $retval = mysql_query( $sql, $conn ); if(! $retval ) { die('Could not enter data: ' . mysql_error()); } echo "Entered data successfully\n"; mysql_close($conn); } else { ?> <form method="post" action="<?php $_PHP_SELF ?>"> <table width="600" border="0" cellspacing="1" cellpadding="2"> <tr> <td width="250">Tutorial Title</td> <td> <input name="runoob_title" type="text" id="runoob_title"> </td> </tr> <tr> <td width="250">Tutorial Author</td> <td> <input name="runoob_author" type="text" id="runoob_author"> </td> </tr> <tr> <td width="250">Submission Date [ yyyy-mm-dd ]</td> <td> <input name="submission_date" type="text" id="submission_date"> </td> </tr> <tr> <td width="250"> </td> <td> </td> </tr> <tr> <td width="250"> </td> <td> <input name="add" type="submit" id="add" value="Add Tutorial"> </td> </tr> </table> </form> <?php } ?> </body> </html>
在我們接收用戶提交的數(shù)據(jù)時(shí),為了數(shù)據(jù)的安全性我們需要使用 get_magic_quotes_gpc() 函數(shù)來判斷特殊字符的轉(zhuǎn)義是否已經(jīng)開啟。如果這個(gè)選項(xiàng)為off(未開啟),返回0,那么我們就必須調(diào)用addslashes 這個(gè)函數(shù)來為字符串增加轉(zhuǎn)義。
義。
你也可以添加其他檢查數(shù)據(jù)的方法,比如郵箱格式驗(yàn)證,電話號(hào)碼驗(yàn)證,是否為整數(shù)驗(yàn)證等。
優(yōu)化 insert 性能
mysql 的 insert 語句語法
insert into `table`(`field1`,`field2`) values('value1','value2');
提高insert 性能的方法
1.一條sql語句插入多條數(shù)據(jù)
INSERT INTO `insert_table` (`uid`, `content`, `type`) VALUES ('userid_0', 'content_0', 0); INSERT INTO `insert_table` (`uid`, `content`, `type`) VALUES ('userid_1', 'content_1', 1);
可以寫成
INSERT INTO `insert_table` (`uid`, `content`, `type`) VALUES ('userid_0', 'content_0', 0), ('userid_1', 'content_1', 1);
2.使用事務(wù)
START TRANSACTION; INSERT INTO `insert_table` (`uid`, `content`, `type`) VALUES ('userid_0', 'content_0', 0); INSERT INTO `insert_table` (`uid`, `content`, `type`) VALUES ('userid_1', 'content_1', 1); ... COMMIT;
注意
1.sql語句長(zhǎng)度有限制,合并sql語句時(shí)要注意。長(zhǎng)度限制可以通過max_allowed_packet配置項(xiàng)修改,默認(rèn)為1M。
2.事務(wù)太大會(huì)影響執(zhí)行效率,mysql有innodb_log_buffer_size配置項(xiàng),超過這個(gè)值會(huì)使用磁盤數(shù)據(jù),影響執(zhí)行效率。
關(guān)于事務(wù)的配置項(xiàng)說明:
1.innodb_buffer_pool_size
如 果用Innodb,那么這是一個(gè)重要變量。相對(duì)于MyISAM來說,Innodb對(duì)于buffer size更敏感。MySIAM可能對(duì)于大數(shù)據(jù)量使用默認(rèn)的key_buffer_size也還好,但I(xiàn)nnodb在大數(shù)據(jù)量時(shí)用默認(rèn)值就感覺在爬了。 Innodb的緩沖池會(huì)緩存數(shù)據(jù)和索引,所以不需要給系統(tǒng)的緩存留空間,如果只用Innodb,可以把這個(gè)值設(shè)為內(nèi)存的70%-80%。和 key_buffer相同,如果數(shù)據(jù)量比較小也不怎么增加,那么不要把這個(gè)值設(shè)太高也可以提高內(nèi)存的使用率。
2.innodb_additional_pool_size
這個(gè)的效果不是很明顯,至少是當(dāng)操作系統(tǒng)能合理分配內(nèi)存時(shí)。但你可能仍需要設(shè)成20M或更多一點(diǎn)以看Innodb會(huì)分配多少內(nèi)存做其他用途。
3.innodb_log_file_size
對(duì)于寫很多尤其是大數(shù)據(jù)量時(shí)非常重要。要注意,大的文件提供更高的性能,但數(shù)據(jù)庫恢復(fù)時(shí)會(huì)用更多的時(shí)間。我一般用64M-512M,具體取決于服務(wù)器的空間。
4.innodb_log_buffer_size
默認(rèn)值對(duì)于多數(shù)中等寫操作和事務(wù)短的運(yùn)用都是可以的。如 果經(jīng)常做更新或者使用了很多blob數(shù)據(jù),應(yīng)該增大這個(gè)值。但太大了也是浪費(fèi)內(nèi)存,因?yàn)?秒鐘總會(huì) flush(這個(gè)詞的中文怎么說呢?)一次,所以不需要設(shè)到超過1秒的需求。8M-16M一般應(yīng)該夠了。小的運(yùn)用可以設(shè)更小一點(diǎn)。
5.innodb_flush_log_at_trx_commit
抱怨Innodb比MyISAM慢 100倍?那么你大概是忘了調(diào)整這個(gè)值。默認(rèn)值1的意思是每一次事務(wù)提交或事務(wù)外的指令都需要把日志寫入(flush)硬盤,這是很費(fèi)時(shí)的。特別是使用電 池供電緩存(Battery backed up cache)時(shí)。設(shè)成2對(duì)于很多運(yùn)用,特別是從MyISAM表轉(zhuǎn)過來的是可以的,它的意思是不寫入硬盤而是寫入系統(tǒng)緩存。日志仍然會(huì)每秒flush到硬 盤,所以你一般不會(huì)丟失超過1-2秒的更新。設(shè)成0會(huì)更快一點(diǎn),但安全方面比較差,即使MySQL掛了也可能會(huì)丟失事務(wù)的數(shù)據(jù)。而值2只會(huì)在整個(gè)操作系統(tǒng) 掛了時(shí)才可能丟數(shù)據(jù)。
相關(guān)文章
MySQL備份與恢復(fù)之真實(shí)環(huán)境使用冷備(2)
這篇文章主要介紹了MySQL備份與恢復(fù)之真實(shí)環(huán)境使用冷備,需要的朋友可以參考下2015-08-08解決MySQL啟動(dòng)報(bào)錯(cuò):ERROR 2003 (HY000): Can''t connect to MySQL serv
這篇文章主要介紹了解決MySQL啟動(dòng)報(bào)錯(cuò):ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061),本文解釋了如何解決該問題,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-0788秒插入1000萬條數(shù)據(jù)到MySQL數(shù)據(jù)庫表的操作方法
這篇文章主要介紹了88秒插入1000萬條數(shù)據(jù)到MySQL數(shù)據(jù)庫表的操作方法,首先給大家說下我用到的數(shù)據(jù)庫表為mysql數(shù)據(jù)庫5.7版本的。具體操作方法大家跟隨小編一起通過本文學(xué)習(xí)吧2018-11-11mysqld-nt: Out of memory (Needed 1677720 bytes)解決方法
這篇文章主要介紹了mysqld-nt: Out of memory (Needed 1677720 bytes)解決方法,需要的朋友可以參考下2014-12-12MySQL關(guān)系型數(shù)據(jù)庫事務(wù)的ACID特性與實(shí)現(xiàn)
這篇文章主要介紹了MySQL關(guān)系型數(shù)據(jù)庫事務(wù)的ACID特性與實(shí)現(xiàn),ACID?是為保證事務(wù)transaction是正確可靠的,具備原子性、一致性、隔離性、持久性等特性2022-07-07