insert into是mysql中最常用的插入語句,它有6種寫法。
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡(jiǎn)單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:空間域名、網(wǎng)絡(luò)空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、朔城網(wǎng)站維護(hù)、網(wǎng)站推廣。
如果插入的記錄是數(shù)字的話要在數(shù)字的逗號(hào)后面加n:
通過以上實(shí)例我們可以看到insert into語句只能向原表中插入于其字段對(duì)應(yīng)的數(shù)據(jù),那么能不能通過insert into語句來把其他表的數(shù)據(jù)插入到原表中呢:
在MySQL中set方法:
ModifyStatement.Set Method 修改語句 set方法
Sets key and value. 設(shè)置鍵和值。
由于insert into語句是一個(gè)插入性的語句,所以它的功能要么向指定的表插入數(shù)據(jù)
也許你看到這個(gè)SQL語句是正確的,就覺得這樣應(yīng)該也可以:
mysql mysql insert into 4a set sname=4ainall.sname;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'mysql insert into 4a set sname=4ainall.sname' at line 1
或者這樣也可以:
mysql mysql insert into 4a set sname="趙六";
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'mysql insert into 4a set sname="趙六"' at line 1
然后這樣也是不可用:
mysql insert into 4a select * from 4ainall set sname=4ainall.sname;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'from 4ainall set sname=4ainall.sname' at line 1
可以看出由于select是作用于4inall這個(gè)表的,而set方法也只能在select語句中,這就直接導(dǎo)致set方法只能作用于4inall這個(gè)表,而無法作用于4a這個(gè)表。
但是如果我們不用select語句的話編譯器又怎么會(huì)知道4inall表中的數(shù)據(jù)在哪里?
顯然select是用于查的而set則是一個(gè)用于改的方法,兩者無法結(jié)合在一起——insert into set語句當(dāng)然也不能用于將其他表的數(shù)據(jù)插入到原表中了。
當(dāng)MySQL表字段設(shè)置 unique key 或者 primary key 時(shí),被約束的字段就必須是唯一的。新插入數(shù)據(jù)直接使用 insert into ,如果出現(xiàn)唯一性沖突,就會(huì)拋出異常。我們應(yīng)該根據(jù)需求選擇合適的插入語句。
為了演示,我們先新建一張user表,SQL語句如下:
當(dāng)插入數(shù)據(jù)時(shí),如果唯一性校驗(yàn)出現(xiàn)重復(fù)問題,則報(bào)錯(cuò);
如果沒有重復(fù)性問題,則執(zhí)行插入操作。
簡(jiǎn)單總結(jié):重復(fù)則直接報(bào)錯(cuò),sql 語句不執(zhí)行,不重復(fù)則插入。
示例
執(zhí)行結(jié)果
當(dāng)插入數(shù)據(jù)時(shí),如果唯一性校驗(yàn)出現(xiàn)重復(fù)問題,則忽略錯(cuò)誤,只以警告形式返回,不執(zhí)行此SQL語句;
如果沒有重復(fù)性問題,則執(zhí)行插入操作。
簡(jiǎn)單總結(jié):重復(fù)則忽略,sql 語句不執(zhí)行,不重復(fù)則插入。
示例
執(zhí)行結(jié)果
當(dāng)插入數(shù)據(jù)時(shí),如果唯一性校驗(yàn)出現(xiàn)重復(fù)問題,則在原有記錄基礎(chǔ)上,更新指定字段內(nèi)容,其它字段內(nèi)容保留;
如果沒有重復(fù)性問題,則執(zhí)行插入操作。
簡(jiǎn)單總結(jié):重復(fù)則更新指定字段,不重復(fù)則插入。
示例
執(zhí)行結(jié)果
表記錄, mobile_phone_number 從 '13800000077' 更新為 '13800000088' 了, update_time 也從 NULL 更新為有值了,但是 id 沒有變:
replace into表示插入替換數(shù)據(jù),當(dāng)插入數(shù)據(jù)時(shí),如果唯一性校驗(yàn)出現(xiàn)重復(fù)問題,刪除舊記錄,插入新記錄;
如果沒有重復(fù)性問題,則執(zhí)行插入操作,效果和insert into是一樣的。
簡(jiǎn)單總結(jié):重復(fù)則先刪除再插入新記錄,不重復(fù)則插入
。
示例
執(zhí)行結(jié)果
表記錄, id 和 mobile_phone_number 變了, update_time 變?yōu)榱俗侄文J(rèn)值 NULL :
replace into 執(zhí)行的邏輯:
示例一
示例一 insert into ... on deplicate key update 操作在 binlog 中記錄為:
示例二
示例二 replace into 操作在binlog中記錄為:
從示例可以看出,使用 replace into 會(huì)有以下問題:
執(zhí)行結(jié)果
因?yàn)槿苛卸际侵付ǖ闹?,所以,相?dāng)于所有字段全部更新了一次。
binlog 中的記錄:
如果出現(xiàn)重復(fù)異常,希望捕獲異常,則使用 insert into ;
如果出現(xiàn)重復(fù)異常,希望保存舊紀(jì)錄,忽略新紀(jì)錄,則使用 insert ignore into ;
如果出現(xiàn)重復(fù)異常,希望更新指定字段,則使用 insert into … on duplicate key update ;
如果出現(xiàn)重復(fù)異常,希望刪除舊記錄,插入新記錄,則使用 replace into 。
mysql中常用的三種插入數(shù)據(jù)的語句:
1、insert into表示插入數(shù)據(jù),數(shù)據(jù)庫(kù)會(huì)檢查主鍵(PrimaryKey),如果出現(xiàn)重復(fù)會(huì)報(bào)錯(cuò);
2、replace into表示插入替換數(shù)據(jù),需求表中有PrimaryKey,或者unique索引的話,如果數(shù)據(jù)庫(kù)已經(jīng)存在數(shù)據(jù),則用新數(shù)據(jù)替換,如果沒有數(shù)據(jù)效果則和insert into一樣;
3、REPLACE語句會(huì)返回一個(gè)數(shù),來指示受影響的行的數(shù)目。該數(shù)是被刪除和被插入的行數(shù)的和。如果對(duì)于一個(gè)單行REPLACE該數(shù)為1,則一行被插入,同時(shí)沒有行被刪除。如果該數(shù)大于1,則在新行被插入前,有一個(gè)或多個(gè)舊行被刪除。如果表包含多個(gè)唯一索引,并且新行復(fù)制了在不同的唯一索引中的不同舊行的值,則有可能是一個(gè)單一行替換了多個(gè)舊行。
MySQL是一個(gè)關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),由瑞典MySQL AB 公司開發(fā),目前屬于 Oracle 旗下產(chǎn)品。MySQL 最流行的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),在 WEB 應(yīng)用方面MySQL是最好的 RDBMS (Relational Database Management System,關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)) 應(yīng)用軟件之一。
MySQL是一種關(guān)聯(lián)數(shù)據(jù)庫(kù)管理系統(tǒng),關(guān)聯(lián)數(shù)據(jù)庫(kù)將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)放在一個(gè)大倉(cāng)庫(kù)內(nèi),這樣就增加了速度并提高了靈活性。
INSERT INTO mt_message (`id`,`name` ,`tel` ,`email` )VALUES (NULL,'111111111', '11', '1')
INSERT INTO mt_message(`id` ,`name` ,`tel` ,`email` ,`qita` ,`content` ,`shijian` ,`user` ,`huifu` ,`shenhe`
//)VALUES (NULL , '1', '2', '', '', '', NOW( ) , '', '', '')
只能說明:你從email開始后面的字段其中有一個(gè)是不能為空的,而且沒有初始值
所以你第一個(gè)語句插入失敗了
我估計(jì)應(yīng)該問題就是在你的時(shí)間(shijian)字段,因?yàn)楹竺婊径际强盏模挥袝r(shí)間不是
你可以去檢查一個(gè)你的這張message表,在mysql命令行用:desc message
檢查數(shù)據(jù)表的字段名和字段屬性,如果不行你可以重新建立數(shù)據(jù)表的
要是想知道出錯(cuò)在哪里,你可以這樣寫:
?php
//..上面程序略
$sql="INSERT INTO mt_message (`id`,`name` ,`tel` ,`email` )VALUES (NULL,'111111111', '11', '1')";
$query=mysql_query($sql);
//執(zhí)行
if($query)
//執(zhí)行成功
echo 'OK';
else
echo '插入失敗,錯(cuò)誤報(bào)告是:'.mysql_error();
//輸出mysql錯(cuò)誤信息函數(shù):mysql_error();
?
MySQL是一個(gè)關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),由瑞典MySQL AB 公司開發(fā),目前屬于?Oracle?旗下產(chǎn)品。MySQL 是最流行的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)之一,在 WEB 應(yīng)用方面,MySQL是最好的 RDBMS (Relational Database Management System,關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)) 應(yīng)用軟件。
MySQL是一種關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng),關(guān)系數(shù)據(jù)庫(kù)將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)放在一個(gè)大倉(cāng)庫(kù)內(nèi),這樣就增加了速度并提高了靈活性。
MySQL所使用的 SQL 語言是用于訪問數(shù)據(jù)庫(kù)的最常用標(biāo)準(zhǔn)化語言。MySQL 軟件采用了雙授權(quán)政策,分為社區(qū)版和商業(yè)版,由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點(diǎn),一般中小型網(wǎng)站的開發(fā)都選擇 MySQL 作為網(wǎng)站數(shù)據(jù)庫(kù)。
由于其社區(qū)版的性能卓越,搭配?PHP?和?Apache?可組成良好的開發(fā)環(huán)境。