《Mysql應(yīng)用MySQL數(shù)據(jù)庫(kù)INSERT、UPDATE、DELETE以及REPLACE語(yǔ)句的用法詳解》要點(diǎn):
本文介紹了Mysql應(yīng)用MySQL數(shù)據(jù)庫(kù)INSERT、UPDATE、DELETE以及REPLACE語(yǔ)句的用法詳解,希望對(duì)您有用。如果有疑問,可以聯(lián)系我們。
MYSQL教程MySQL數(shù)據(jù)庫(kù)insert和update語(yǔ)句
引:用于操作數(shù)據(jù)庫(kù)的SQL一般分為兩種,一種是查詢語(yǔ)句,也就是我們所說的SELECT語(yǔ)句,另外一種就是更新語(yǔ)句,也叫做數(shù)據(jù)操作語(yǔ)句.言外之意,就是對(duì)數(shù)據(jù)進(jìn)行修改.在標(biāo)準(zhǔn)的SQL中有3個(gè)語(yǔ)句,它們是INSERT、UPDATE以及DELETE.
用于操作數(shù)據(jù)庫(kù)的SQL一般分為兩種,一種是查詢語(yǔ)句,也就是我們所說的SELECT語(yǔ)句,另外一種就是更新語(yǔ)句,也叫做數(shù)據(jù)操作語(yǔ)句.言外之意,就 是對(duì)數(shù)據(jù)進(jìn)行修改.在標(biāo)準(zhǔn)的SQL中有3個(gè)語(yǔ)句,它們是INSERT、UPDATE以及DELETE.在MySQL中又多了一個(gè)REPLACE語(yǔ)句,因 此,本文以MySQL為背景來討論如何使有SQL中的更新語(yǔ)句.
MYSQL教程一、INSERT和REPLACE
INSERT和REPLACE語(yǔ)句的功能都是向表中插入新的數(shù)據(jù).這兩條語(yǔ)句的語(yǔ)法類似.它們的主要區(qū)別是如何處理重復(fù)的數(shù)據(jù).
MYSQL教程1. INSERT的一般用法
MySQL中的INSERT語(yǔ)句和標(biāo)準(zhǔn)的INSERT不太一樣,在標(biāo)準(zhǔn)的SQL語(yǔ)句中,一次插入一條記錄的INSERT語(yǔ)句只有一種形式.
INSERT INTO tablename(列名…) VALUES(列值);
而在MySQL中還有另外一種形式.
INSERT INTO tablename SET column_name1 = value1, column_name2 = value2,…;
第一種辦法將列名和列值分開了,在使用時(shí),列名必須和列值的數(shù)一致.如下面的語(yǔ)句向users表中插入了一條記錄:
INSERT INTO users(id, name, age) VALUES(123, '姚明', 25);
第二種辦法允許列名和列值成對(duì)出現(xiàn)和使用,如下面的語(yǔ)句將產(chǎn)生中樣的效果.
INSERT INTO users SET id = 123, name = '姚明', age = 25;
如果使用了SET方式,必須至少為一列賦值.如果某一個(gè)字段使用了省缺值(如默認(rèn)或自增值),這兩種辦法都可以省略這些字段.如id字段上使用了自增值,上面兩條語(yǔ)句可以寫成如下形式:
INSERT INTO users (name, age) VALUES('姚明',25);
INSERT INTO uses SET name = '姚明', age = 25;
MySQL在VALUES上也做了些變化.如果VALUES中什么都不寫,那MySQL將使用表中每一列的默認(rèn)值來插入新記錄.
INSERT INTO users () VALUES();
如果表名后什么都不寫,就表示向表中所有的字段賦值.使用這種方式,不僅在VALUES中的值要和列數(shù)一致,而且順序不能顛倒. INSERT INTO users VALUES(123, '姚明', 25);
如果將INSERT語(yǔ)句寫成如下形式MySQL將會(huì)報(bào)錯(cuò).
INSERT INTO users VALUES('姚明',25);
MYSQL教程2. 使用INSERT插入多條記錄
看到這個(gè)標(biāo)題也許大家會(huì)問,這有什么好說的,調(diào)用多次INSERT語(yǔ)句不就可以插入多條記錄了嗎!但使用這種辦法要增加服務(wù)器的負(fù)荷,因?yàn)?執(zhí)行每一次 SQL服務(wù)器都要同樣對(duì)SQL進(jìn)行分析、優(yōu)化等操作.幸好MySQL提供了另一種解決方案,就是使用一條INSERT語(yǔ)句來插入多條記錄.這并不是標(biāo)準(zhǔn)的 SQL語(yǔ)法,因此只能在MySQL中使用.
INSERT INTO users(name, age)
VALUES('姚明', 25), ('比爾.蓋茨', 50), ('火星人', 600);
上面的INSERT 語(yǔ)句向users表中連續(xù)插入了3條記錄.值得注意的是,上面的INSERT語(yǔ)句中的VALUES后必須每一條記錄的值放到一對(duì)(…)中,中間使用","分割.假設(shè)有一個(gè)表table1
CREATE TABLE table1(n INT);
如果要向table1中插入5條記錄,下面寫法是錯(cuò)誤的:
INSERT INTO table1 (i) VALUES(1,2,3,4,5);
MySQL將會(huì)拋出下面的錯(cuò)誤
ERROR 1136: Column count doesn't match value count at row 1
而正確的寫法應(yīng)該是這樣:
INSERT INTO t able1(i) VALUES(1),(2),(3),(4),(5);
當(dāng)然,這種寫法也可以省略列名,這樣每一對(duì)括號(hào)里的值的數(shù)目必須一致,而且這個(gè)數(shù)目必須和列數(shù)一致.如:
INSERT INTO t able1 VALUES(1),(2),(3),(4),(5);
MYSQL教程3. REPLACE語(yǔ)句
我們?cè)谑褂脭?shù)據(jù)庫(kù)時(shí)可能會(huì)經(jīng)常遇到這種情況.如果一個(gè)表在一個(gè)字段上建立了唯一索引,當(dāng)我們?cè)傧蜻@個(gè)表中使用已經(jīng)存在的鍵值插入一條記錄,那將會(huì)拋出一 個(gè)主鍵沖突的錯(cuò)誤.當(dāng)然,我們可能想用新記錄的值來覆蓋原來的記錄值.如果使用傳統(tǒng)的做法,必須先使用DELETE語(yǔ)句刪除原先的記錄,然后再使用 INSERT插入新的記錄.而在MySQL中為我們提供了一種新的解決方案,這就是REPLACE語(yǔ)句.使用REPLACE插入一條記錄時(shí),如果不重 復(fù),REPLACE就和INSERT的功能一樣,如果有重復(fù)記錄,REPLACE就使用新記錄的值來替換原來的記錄值.
使用REPLACE的最大好處就是可以將DELETE和INSERT合二為一,形成一個(gè)原子操作.這樣就可以不必考慮在同時(shí)使用DELETE和INSERT時(shí)添加事務(wù)等復(fù)雜操作了.
在使用REPLACE時(shí),表中必須有唯一索引,而且這個(gè)索引所在的字段不能允許空值,否則REPLACE就和INSERT完全一樣的.
在執(zhí)行REPLACE后,系統(tǒng)返回了所影響的行數(shù),如果返回1,說明在表中并沒有重復(fù)的記錄,如果返回2,說明有一條重復(fù)記錄,系統(tǒng)自動(dòng)先調(diào)用了 DELETE刪除這條記錄,然后再記錄用INSERT來插入這條記錄.如果返回的值大于2,那說明有多個(gè)唯一索引,有多條記錄被刪除和插入.
REPLACE的語(yǔ)法和INSERT非常的相似,如下面的REPLACE語(yǔ)句是插入或更新一條記錄.
REPLACE INTO users (id,name,age) VALUES(123, '趙本山', 50);
插入多條記錄:
REPLACE INTO users(id, name, age)
VALUES(123, '趙本山', 50), (134,'Mary',15);
REPLACE也可以使用SET語(yǔ)句
REPLACE INTO users SET id = 123, name = '趙本山', age = 50;
上面曾提到REPLACE可能影響3條以上的記錄,這是因?yàn)樵诒碇杏谐^一個(gè)的唯一索引.在這種情況下,REPLACE將考慮每一個(gè)唯一索引,并對(duì)每一 個(gè)索引對(duì)應(yīng)的重復(fù)記錄都刪除,然后插入這條新記錄.假設(shè)有一個(gè)table1表,有3個(gè)字段a, b, c.它們都有一個(gè)唯一索引.
CREATE TABLE table1(a INT NOT NULL UNIQUE,b INT NOT NULL UNIQUE,c INT NOT NULL UNIQUE);
假設(shè)table1中已經(jīng)有了3條記錄
a b c
1 1 1
2 2 2
3 3 3
下面我們使用REPLACE語(yǔ)句向table1中插入一條記錄.
REPLACE INTO table1(a, b, c) VALUES(1,2,3);
返回的結(jié)果如下
Query OK, 4 rows affected (0.00 sec)
在table1中的記錄如下
a b c
1 2 3
我們可以看到,REPLACE將原先的3條記錄都刪除了,然后將(1, 2, 3)插入.
MYSQL教程二、UPDATE
UPDATE的功能是更新表中的數(shù)據(jù).這的語(yǔ)法和INSERT的第二種用法相似.必須提供表名以及SET表達(dá)式,在后面可以加WHERE以限制更新的記錄范圍.
UPDATE table_anem SET column_name1 = value1, column_name2 = value2, ...
WHERE ... ;
如下面的語(yǔ)句將users表中id等于123的記錄的age改為24
UPDATE users SET age = 24 WHERE id = 123;
同樣,可以使用UPDATE更新多個(gè)字段的值 UPDATE users SET age = 24, name = 'Mike' WHERE id = 123;
上面的UPDATE語(yǔ)句通過WHERE指定一個(gè)條件,否則,UPDATE將更新表中的所有記錄的值.
在使用UPDATE更新記錄時(shí),如果被更新的字段的類型和所賦的值不匹配時(shí),MySQL將這個(gè)值轉(zhuǎn)換為相應(yīng)類型的值.如果這個(gè)字段是數(shù)值類型,而且所賦 值超過了這個(gè)數(shù)據(jù)類型的最大范圍,那么MySQL就將這個(gè)值轉(zhuǎn)換為這個(gè)范圍最大或最小值.如果字符串太長(zhǎng),MySQL就將多余的字符串截去.如果設(shè)置非空 字段為空,那么將這個(gè)字段設(shè)置為它們的默認(rèn)值,數(shù)字的默認(rèn)值是0,字符串的默認(rèn)值是空串(不是null,是"").
有兩種情況UPDATE不會(huì)對(duì)影響表中的數(shù)據(jù).
1. 當(dāng)WHERE中的條件在表中沒有記錄和它匹配時(shí).
2. 當(dāng)我們將同樣的值賦給某個(gè)字段時(shí),如將字段abc賦為'123',而abc的原值就是'123'.
和INSERT、REPLACE一樣,UPDATE也返回所更新的記錄數(shù).但這些記錄數(shù)并不包括滿足WHERE條件的,但卻未被更新的記錄.如下同的UPDATE語(yǔ)句就未更新任何記錄.
UPDATE users SET age = 30 WHERE id = 12;
Query OK, 0 rows affected (0.00 sec)
需要注意的時(shí),如果一個(gè)字段的類型是TIMESTAMP,那么這個(gè)字段在其它字段更新時(shí)自動(dòng)更新.
在有些時(shí)候我們需要得到UPDATE所選擇的行數(shù),而不是被更新的行數(shù).我們可以通過一些API來達(dá)到這個(gè)目的.如MySQL提供的C API提供了一個(gè)選項(xiàng)可以得到你想要的記錄數(shù).而MySQL的JDBC驅(qū)動(dòng)得到的默認(rèn)記錄數(shù)也是匹配的記錄數(shù).
UPDATE和REPLACE基本類似,但是它們之間有兩點(diǎn)不同.
1. UPDATE在沒有匹配記錄時(shí)什么都不做,而REPLACE在有重復(fù)記錄時(shí)更新,在沒有重復(fù)記錄時(shí)插入.
2. UPDATE可以選擇性地更新記錄的一部分字段.而REPLACE在發(fā)現(xiàn)有重復(fù)記錄時(shí)就將這條記錄徹底刪除,再插入新的記錄.也就是說,將所有的字段都更新了.
MYSQL教程三、DELETE和TRUNCATE TABLE
在MySQL中有兩種辦法可以刪除數(shù)據(jù),一種是DELETE語(yǔ)句,另一種是TRUNCATE TABLE語(yǔ)句.DELETE語(yǔ)句可以通過WHERE對(duì)要?jiǎng)h除的記錄進(jìn)行選擇.而使用TRUNCATE TABLE將刪除表中的所有記錄.因此,DELETE語(yǔ)句更靈活.
如果要清空表中的所有記錄,可以使用下面的兩種辦法:
DELETE FROM table1
TRUNCATE TABLE table1
其中第二條記錄中的TABLE是可選的.
如果要?jiǎng)h除表中的部分記錄,只能使用DELETE語(yǔ)句.
DELETE FROM table1 WHERE ...;
如果DELETE不加WHERE子句,那么它和TRUNCATE TABLE是一樣的,但它們有一點(diǎn)不同,那就是DELETE可以返回被刪除的記錄數(shù),而TRUNCATE TABLE返回的是0.
如果一個(gè)表中有自增字段,使用TRUNCATE TABLE和沒有WHERE子句的DELETE刪除所有記錄后,這個(gè)自增字段將起始值恢復(fù)成1.如果你不想這樣做的話,可以在DELETE語(yǔ)句中加上永真的WHERE,如WHERE 1或WHERE true.
DELETE FROM table1 WHERE 1;
上面的語(yǔ)句在執(zhí)行時(shí)將掃描每一條記錄.但它并不比較,因?yàn)檫@個(gè)WHERE條件永遠(yuǎn)為true.這樣做雖然可以保持自增的最大值,但由于它是掃描了所有的記錄,因此,它的執(zhí)行成本要比沒有WHERE子句的DELETE大得多.
DELETE和TRUNCATE TABLE的最大區(qū)別是DELETE可以通過WHERE語(yǔ)句選擇要?jiǎng)h除的記錄.但執(zhí)行得速度不快.而且還可以返回被刪除的記錄數(shù).而TRUNCATE TABLE無法刪除指定的記錄,而且不能返回被刪除的記錄.但它執(zhí)行得非常快.
和標(biāo)準(zhǔn)的SQL語(yǔ)句不同,DELETE支持ORDER BY和LIMIT子句,通過這兩個(gè)子句,我們可以更好地控制要?jiǎng)h除的記錄.如當(dāng)我們只想刪除WHERE子句過濾出來的記錄的一部分,可以使用LIMIB, 如果要?jiǎng)h除后幾條記錄,可以通過ORDER BY和LIMIT配合使用.假設(shè)我們要?jiǎng)h除users表中name等于"Mike"的前6條記錄.可以使用如下的DELETE語(yǔ)句:
DELETE FROM users WHERE name = 'Mike' LIMIT 6;
一般MySQL并不確定刪除的這6條記錄是哪6條,為了更保險(xiǎn),我們可以使用ORDER BY對(duì)記錄進(jìn)行排序.
DELETE FROM users WHERE name = 'Mike' ORDER BY id DESC LIMIT 6
維易PHP培訓(xùn)學(xué)院每天發(fā)布《Mysql應(yīng)用MySQL數(shù)據(jù)庫(kù)INSERT、UPDATE、DELETE以及REPLACE語(yǔ)句的用法詳解》等實(shí)戰(zhàn)技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養(yǎng)人才。
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/12958.html