青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

woaidongmao

文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見(jiàn)諒!~
隨筆 - 1469, 文章 - 0, 評(píng)論 - 661, 引用 - 0
數(shù)據(jù)加載中……

MySQL數(shù)據(jù)庫(kù)之UPDATE更新語(yǔ)句精解

  用于操作數(shù)據(jù)庫(kù)的SQL一般分為兩種,一種是查詢語(yǔ)句,也就是我們所說(shuō)的SELECT語(yǔ)句,另外一種就是更新語(yǔ)句,也叫做數(shù)據(jù)操作語(yǔ)句。本文以MySQL為背景來(lái)討論如何使有SQL中的更新語(yǔ)句。

  一、INSERTREPLACE

  INSERTREPLACE語(yǔ)句的功能都是向表中插入新的數(shù)據(jù)。這兩條語(yǔ)句的語(yǔ)法類似。它們的主要區(qū)別是如何處理重復(fù)的數(shù)據(jù)。

  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…;

  第一種方法將列名和列值分開(kāi)了,在使用時(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;

  MySQLVALUES上也做了些變化。如果VALUES中什么都不寫,那MySQL將使用表中每一列的默認(rèn)值來(lái)插入新記錄。

  

     INSERT INTO users () VALUES();

   如果表名后什么都不寫,就表示向表中所有的字段賦值。使用這種方式,不僅在VALUES中的值要和列數(shù)一致,而且順序不能顛倒。

      INSERT INTO users VALUES(123, '姚明', 25);

  如果將INSERT語(yǔ)句寫成如下形式MySQL將會(huì)報(bào)錯(cuò)。

  

      INSERT INTO users VALUES('姚明',25);

  2. 使用INSERT插入多條記錄

  看到這個(gè)標(biāo)題也許大家會(huì)問(wèn),這有什么好說(shuō)的,調(diào)用多次INSERT語(yǔ)句不就可以插入多條記錄了嗎!但使用這種方法要增加服務(wù)器的負(fù)荷,因?yàn)椋瑘?zhí)行每一次SQL服務(wù)器都要同樣對(duì)SQL進(jìn)行分析、優(yōu)化等操作。幸好MySQL提供了另一種解決方案,就是使用一條INSERT語(yǔ)句來(lái)插入多條記錄。這并不是標(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 table1(i) VALUES(1),(2),(3),(4),(5);

  當(dāng)然,這種寫法也可以省略列名,這樣每一對(duì)括號(hào)里的值的數(shù)目必須一致,而且這個(gè)數(shù)目必須和列數(shù)一致。如:

  

      INSERT INTO table1 VALUES(1),(2),(3),(4),(5);

  3. REPLACE語(yǔ)句

  我們?cè)谑褂脭?shù)據(jù)庫(kù)時(shí)可能會(huì)經(jīng)常遇到這種情況。如果一個(gè)表在一個(gè)字段上建立了唯一索引,當(dāng)我們?cè)傧蜻@個(gè)表中使用已經(jīng)存在的鍵值插入一條記錄,那將會(huì)拋出一個(gè)主鍵沖突的錯(cuò)誤。當(dāng)然,我們可能想用新記錄的值來(lái)覆蓋原來(lái)的記錄值。如果使用傳統(tǒng)的做法,必須先使用 DELETE語(yǔ)句刪除原先的記錄,然后再使用INSERT插入新的記錄。而在MySQL中為我們提供了一種新的解決方案,這就是REPLACE語(yǔ)句。使用 REPLACE插入一條記錄時(shí),如果不重復(fù),REPLACE就和INSERT的功能一樣,如果有重復(fù)記錄,REPLACE就使用新記錄的值來(lái)替換原來(lái)的記錄值。

  使用REPLACE的最大好處就是可以將DELETEINSERT合二為一,形成一個(gè)原子操作。這樣就可以不必考慮在同時(shí)使用DELETEINSERT時(shí)添加事務(wù)等復(fù)雜操作了。

  在使用REPLACE時(shí),表中必須有唯一索引,而且這個(gè)索引所在的字段不能允許空值,否則REPLACE就和INSERT完全一樣的。

  在執(zhí)行REPLACE后,系統(tǒng)返回了所影響的行數(shù),如果返回1,說(shuō)明在表中并沒(méi)有重復(fù)的記錄,如果返回2,說(shuō)明有一條重復(fù)記錄,系統(tǒng)自動(dòng)先調(diào)用了 DELETE刪除這條記錄,然后再記錄用INSERT來(lái)插入這條記錄。如果返回的值大于2,那說(shuō)明有多個(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)樵诒碇杏谐^(guò)一個(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)插入。

  二、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ǔ)句通過(guò)WHERE指定一個(gè)條件,否則,UPDATE將更新表中的所有記錄的值。

  在使用UPDATE更新記錄時(shí),如果被更新的字段的類型和所賦的值不匹配時(shí),MySQL將這個(gè)值轉(zhuǎn)換為相應(yīng)類型的值。如果這個(gè)字段是數(shù)值類型,而且所賦值超過(guò)了這個(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中的條件在表中沒(méi)有記錄和它匹配時(shí)。

  2. 當(dāng)我們將同樣的值賦給某個(gè)字段時(shí),如將字段abc賦為'123',而abc的原值就是'123'

  和INSERTREPLACE一樣,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ù)。我們可以通過(guò)一些API來(lái)達(dá)到這個(gè)目的。如MySQL提供的C API提供了一個(gè)選項(xiàng)可以得到你想要的記錄數(shù)。而MySQLJDBC驅(qū)動(dòng)得到的默認(rèn)記錄數(shù)也是匹配的記錄數(shù)。

  UPDATEREPLACE基本類似,但是它們之間有兩點(diǎn)不同。

  1. UPDATE在沒(méi)有匹配記錄時(shí)什么都不做,而REPLACE在有重復(fù)記錄時(shí)更新,在沒(méi)有重復(fù)記錄時(shí)插入。

  2. UPDATE可以選擇性地更新記錄的一部分字段。而REPLACE在發(fā)現(xiàn)有重復(fù)記錄時(shí)就將這條記錄徹底刪除,再插入新的記錄。也就是說(shuō),將所有的字段都更新了。

  三、DELETETRUNCATE TABLE

  在MySQL中有兩種方法可以刪除數(shù)據(jù),一種是DELETE語(yǔ)句,另一種是TRUNCATE TABLE語(yǔ)句。DELETE語(yǔ)句可以通過(guò)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和沒(méi)有WHERE子句的DELETE刪除所有記錄后,這個(gè)自增字段將起始值恢復(fù)成1.如果你不想這樣做的話,可以在DELETE語(yǔ)句中加上永真的WHERE,如WHERE 1WHERE true

  

     DELETE FROM table1 WHERE 1;

  上面的語(yǔ)句在執(zhí)行時(shí)將掃描每一條記錄。但它并不比較,因?yàn)檫@個(gè)WHERE條件永遠(yuǎn)為true。這樣做雖然可以保持自增的最大值,但由于它是掃描了所有的記錄,因此,它的執(zhí)行成本要比沒(méi)有WHERE子句的DELETE大得多。

  DELETETRUNCATE TABLE的最大區(qū)別是DELETE可以通過(guò)WHERE語(yǔ)句選擇要?jiǎng)h除的記錄。但執(zhí)行得速度不快。而且還可以返回被刪除的記錄數(shù)。而TRUNCATE TABLE無(wú)法刪除指定的記錄,而且不能返回被刪除的記錄。但它執(zhí)行得非常快。

  與標(biāo)準(zhǔn)的SQL語(yǔ)句不同,DELETE支持ORDER BYLIMIT子句,通過(guò)這兩個(gè)子句,我們可以更好地控制要?jiǎng)h除的記錄。如當(dāng)我們只想刪除WHERE子句過(guò)濾出來(lái)的記錄的一部分,可以使用LIMIB,如果要?jiǎng)h除后幾條記錄,可以通過(guò)ORDER BYLIMIT配合使用。假設(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)行排序。

 

posted on 2009-06-23 18:22 肥仔 閱讀(4063) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 數(shù)據(jù)庫(kù)

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲人成在线观看网站高清| 亚洲视频在线免费观看| 欧美视频导航| 亚洲欧美国产日韩中文字幕| 午夜欧美大尺度福利影院在线看| 激情av一区| 99精品视频免费全部在线| 国产亚洲精品7777| 亚洲娇小video精品| 国产精品视频午夜| 亚洲电影免费在线观看| 国产欧美一区二区白浆黑人| 欧美91精品| 国产欧美日韩亚洲| 亚洲国产精品电影在线观看| 国产欧美一区二区精品婷婷| 亚洲激情第一页| 国模套图日韩精品一区二区| 夜夜嗨一区二区| 最新日韩欧美| 久久国产一区| 午夜精品一区二区在线观看| 欧美激情精品久久久久久大尺度 | 亚洲精品国产拍免费91在线| 国产午夜精品美女视频明星a级| 亚洲激情精品| 亚洲高清免费视频| 欧美一激情一区二区三区| 亚洲私人影院在线观看| 欧美不卡高清| 美乳少妇欧美精品| 国产视频欧美| 亚洲综合三区| 亚洲一区二区三区免费在线观看| 美女在线一区二区| 久久久久久久综合色一本| 国产精品一区二区视频| 日韩亚洲综合在线| 亚洲免费精彩视频| 免费不卡中文字幕视频| 老鸭窝91久久精品色噜噜导演| 国产精品亚发布| 99这里只有精品| 日韩一级免费| 欧美精品一区二区三区在线播放| 欧美黄在线观看| 91久久精品一区| 免费欧美网站| 亚洲黄色大片| 日韩视频一区二区三区| 欧美黑人国产人伦爽爽爽| 99国内精品| 欧美激情久久久| 亚洲精品影院| 一区二区免费看| 欧美精品一区二区在线观看| 亚洲国产精品999| 亚洲三级电影在线观看| 欧美激情第8页| 亚洲精品欧美激情| 老鸭窝91久久精品色噜噜导演| 久久嫩草精品久久久精品一| 国产亚洲精品久久久久动| 性欧美videos另类喷潮| 久久久久久网| 亚洲国产99| 欧美日本国产一区| 一区二区精品在线| 国产一区二区三区在线观看视频| 亚洲欧美一区二区精品久久久| 亚洲午夜精品国产| 国产精品网红福利| 久久国产日韩| 欧美激情亚洲国产| 夜夜嗨av一区二区三区中文字幕| 欧美激情一区二区| 一区二区日韩伦理片| 午夜日本精品| 精品粉嫩aⅴ一区二区三区四区| 久久综合色播五月| 亚洲欧洲一区二区三区在线观看 | 亚洲人成人一区二区在线观看| 一区二区欧美视频| 国产精品久久综合| 久久国产一区二区三区| 91久久精品一区二区别| 亚洲一区二区毛片| 国产乱码精品一区二区三区不卡| 久久精品免费| 亚洲国产成人久久综合一区| 亚洲影音一区| 黄色另类av| 欧美xart系列在线观看| 在线亚洲成人| 免费成人av| 亚洲一区在线视频| 亚洲国产精品www| 国产精品久久一卡二卡| 久久久久久国产精品一区| 亚洲国产欧美一区| 性欧美大战久久久久久久免费观看 | 欧美午夜电影在线观看| 久久精品视频免费| 日韩一区二区精品| 美女视频黄a大片欧美| 亚洲尤物视频网| 亚洲国产精品99久久久久久久久| 国产精品久久久久影院亚瑟| 久久婷婷国产综合精品青草| 亚洲午夜精品久久久久久app| 欧美激情四色 | 欧美三级网页| 久久综合狠狠| 午夜国产精品视频| 亚洲精品在线观看免费| 麻豆成人在线| 性色av香蕉一区二区| 亚洲精品久久久久久久久| 国产亚洲欧洲| 国产精品久久久久77777| 日韩一区二区精品视频| 免费一级欧美在线大片| 亚洲欧美另类中文字幕| 亚洲日本中文字幕免费在线不卡| 国产欧美va欧美va香蕉在| 欧美日韩高清不卡| 麻豆国产精品一区二区三区 | av成人手机在线| 精品99视频| 国产日韩精品一区二区三区在线| 欧美午夜在线一二页| 欧美+日本+国产+在线a∨观看| 久久久国产精品一区| 午夜精品三级视频福利| 亚洲永久精品国产| 亚洲深爱激情| 一区二区欧美亚洲| 夜夜嗨av一区二区三区四区| 亚洲福利视频一区| 亚洲高清影视| 亚洲激情偷拍| 欧美不卡三区| 欧美成人精品1314www| 欧美黄网免费在线观看| 欧美激情第4页| 亚洲日本aⅴ片在线观看香蕉| 亚洲国产精品久久人人爱蜜臀| 欧美成人中文| 亚洲黄色在线观看| 亚洲精品乱码久久久久久黑人| 亚洲人成人一区二区在线观看| 亚洲国产裸拍裸体视频在线观看乱了 | 欧美在线首页| 久久www成人_看片免费不卡| 欧美亚洲综合另类| 久久精品亚洲精品国产欧美kt∨| 久久久国产精品一区| 毛片一区二区| 欧美全黄视频| 国产精品蜜臀在线观看| 国产日韩欧美视频| 精品999网站| 亚洲免费观看在线视频| 亚洲婷婷综合久久一本伊一区| 亚洲中午字幕| 久久精品理论片| 免费成人你懂的| 亚洲国产精品va在看黑人| 亚洲裸体俱乐部裸体舞表演av| 夜夜狂射影院欧美极品| 欧美一区国产在线| 欧美v日韩v国产v| 亚洲欧美久久| 老司机免费视频一区二区| 欧美日韩国产成人在线观看| 国产精品看片资源| 激情成人在线视频| 亚洲精品久久久一区二区三区| 一本色道久久综合亚洲精品不 | 欧美超级免费视 在线| 欧美日韩另类视频| 国产综合在线看| 亚洲伦理在线观看| 欧美一二三视频| 欧美福利视频| 中文在线一区| 久久久久在线观看| 国产精品jvid在线观看蜜臀| 好吊成人免视频| 中文在线一区| 玖玖视频精品| 一级日韩一区在线观看| 久久永久免费| 国产精品一区二区女厕厕| 亚洲毛片在线免费观看| 久久精品一区二区三区不卡| 亚洲经典在线| 久久网站免费| 国产精品丝袜白浆摸在线| 午夜视频一区在线观看|