MySQL中insert語句的使用與最佳化教程_Mysql

來源:互聯網
上載者:User

MySQL 表中使用 INSERT INTO SQL語句來插入資料。
你可以通過 mysql> 命令提示視窗中向資料表中插入資料,或者通過PHP指令碼來插入資料。
文法
以下為向MySQL資料表插入資料通用的 INSERT INTO SQL文法:

INSERT INTO table_name ( field1, field2,...fieldN )            VALUES            ( value1, value2,...valueN );

如果資料是字元型,必須使用單引號或者雙引號,如:"value"。
通過命令提示視窗插入資料
以下我們將使用 SQL INSERT INTO 語句向 MySQL 資料表 runoob_tbl 插入資料
執行個體
以下執行個體中我們將想 runoob_tbl 表插入三條資料:

root@host# mysql -u root -p password;Enter password:*******mysql> use RUNOOB;Database changedmysql> 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>


注意: 使用箭頭標記(->)不是SQL語句的一部分,它僅僅表示一個新行,如果一條SQL語句太長,我們可以通過斷行符號鍵來建立一個新行來編寫SQL語句,SQL語句的命令結束符為分號(;)。
在以上執行個體中,我們並沒有提供 runoob_id 的資料,因為該欄位我們在建立表的時候已經設定它為 AUTO_INCREMENT(自動增加) 屬性。 所以,該欄位會自動遞增而不需要我們去設定。執行個體中 NOW() 是一個 MySQL 函數,該函數返回日期和時間。
使用PHP指令碼插入資料
你可以使用PHP 的 mysql_query() 函數來執行 SQL INSERT INTO命令來插入資料。
該函數有兩個參數,在執行成功時返回 TRUE,否則返回 FALSE。
文法

bool mysql_query( sql, connection );

參數:
sql:必需,規定要發送的 SQL 查詢,注意、查詢字串不應以分號結束。
connection:可選,規定 SQL 串連標識符,如果未規定,則使用上一個開啟的串連。
執行個體
以下執行個體中程式接收使用者輸入的三個欄位資料,並插入資料表中:

<html><head><title>向 MySQL 資料庫添加資料</title></head><body><?phpif(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>

在我們接收使用者提交的資料時,為了資料的安全性我們需要使用 get_magic_quotes_gpc() 函數來判斷特殊字元的轉義是否已經開啟。如果這個選項為off(未開啟),返回0,那麼我們就必須調用addslashes 這個函數來為字串增加轉義。
義。
你也可以添加其他檢查資料的方法,比如郵箱格式驗證,電話號碼驗證,是否為整數驗證等。


最佳化 insert 效能
mysql 的 insert 語句文法

insert into `table`(`field1`,`field2`) values('value1','value2'); 

提高insert 效能的方法
1.一條sql語句插入多條資料

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.使用事務

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語句長度有限制,合并sql語句時要注意。長度限制可以通過max_allowed_packet配置項修改,預設為1M。
2.事務太大會影響執行效率,mysql有innodb_log_buffer_size配置項,超過這個值會使用磁碟資料,影響執行效率。

關於事務的配置項說明:
1.innodb_buffer_pool_size
如 果用Innodb,那麼這是一個重要變數。相對於MyISAM來說,Innodb對於buffer size更敏感。MySIAM可能對於大資料量使用預設的key_buffer_size也還好,但Innodb在大資料量時用預設值就感覺在爬了。 Innodb的緩衝池會快取資料和索引,所以不需要給系統的緩衝留空間,如果只用Innodb,可以把這個值設為記憶體的70%-80%。和 key_buffer相同,如果資料量比較小也不怎麼增加,那麼不要把這個值設太高也可以提高記憶體的使用率。

2.innodb_additional_pool_size
這個的效果不是很明顯,至少是當作業系統能合理分配記憶體時。但你可能仍需要設成20M或更多一點以看Innodb會分配多少記憶體做其他用途。

3.innodb_log_file_size
對於寫很多尤其是大資料量時非常重要。要注意,大的檔案提供更高的效能,但資料庫恢複時會用更多的時間。我一般用64M-512M,具體取決於伺服器的空間。

4.innodb_log_buffer_size
預設值對於多數中等寫操作和事務短的運用都是可以的。如 果經常做更新或者使用了很多blob資料,應該增大這個值。但太大了也是浪費記憶體,因為1秒鐘總會 flush(這個詞的中文怎麼說呢?)一次,所以不需要設到超過1秒的需求。8M-16M一般應該夠了。小的運用可以設更小一點。

5.innodb_flush_log_at_trx_commit
抱怨Innodb比MyISAM慢 100倍?那麼你大概是忘了調整這個值。預設值1的意思是每一次事務提交或事務外的指令都需要把日誌寫入(flush)硬碟,這是很費時的。特別是使用電 池供電緩衝(Battery backed up cache)時。設成2對於很多運用,特別是從MyISAM錶轉過來的是可以的,它的意思是不寫入硬碟而是寫入系統緩衝。日誌仍然會每秒flush到硬 盤,所以你一般不會丟失超過1-2秒的更新。設成0會更快一點,但安全方面比較差,即使MySQL掛了也可能會丟失事務的資料。而值2隻會在整個作業系統 掛了時才可能丟資料。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.