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

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一区特黄| 欧美日韩视频专区在线播放| 91久久精品久久国产性色也91| 日韩一区二区免费看| 国产精品一区二区久久| 欧美国产一区在线| 久久一二三区| 99视频在线精品国自产拍免费观看| 欧美午夜宅男影院| 欧美中文字幕在线视频| 久久久国产精彩视频美女艺术照福利| 日韩视频不卡中文| 欧美日韩国产高清视频| 欧美日韩成人在线观看| 美女主播精品视频一二三四| 另类亚洲自拍| 亚洲欧美精品| 激情国产一区二区| 久久一综合视频| 欧美高清不卡| 99re6热只有精品免费观看| 亚洲综合电影| 欧美一区二区三区婷婷月色| 国产日本亚洲高清| 欧美成人午夜激情| 国产精品美女xx| 99精品欧美一区二区三区综合在线| 亚洲欧洲一二三| 亚洲图片激情小说| 亚洲国产精品尤物yw在线观看| 国产在线精品一区二区夜色| 亚洲一卡久久| 农村妇女精品| 久久亚洲美女| 亚洲精品一区二区在线| 欧美jizz19hd性欧美| 老司机精品久久| 国产真实久久| 国产午夜精品美女视频明星a级| 久久综合一区二区三区| 麻豆精品在线播放| 在线精品国产成人综合| 欧美经典一区二区三区| 亚洲一区二区成人| 久久蜜桃精品| 欧美成人免费在线观看| 久久人人97超碰人人澡爱香蕉| 日韩亚洲国产欧美| 欧美激情精品久久久久久| 午夜日韩电影| 亚洲人在线视频| 亚洲国产经典视频| 9国产精品视频| 欧美日韩视频第一区| 久久天天躁狠狠躁夜夜爽蜜月| 久久不射中文字幕| 亚洲欧洲日韩在线| 亚洲免费在线电影| 久久国产一区二区| 日韩午夜电影av| 欧美中文在线视频| 久久久久久亚洲精品中文字幕| 欧美一区亚洲一区| 99精品视频一区| 欧美激情一区二区三区蜜桃视频| 日韩亚洲欧美成人| 久久久久久九九九九| 蜜桃视频一区| 韩国精品在线观看| 国产精品综合| 亚洲日本欧美在线| 一区二区三区在线观看视频| 欧美精品激情| 久久在线免费观看视频| 欧美/亚洲一区| 欧美日本亚洲视频| 久久精品在线| 狠狠色丁香婷婷综合| 亚洲第一页中文字幕| 麻豆国产精品va在线观看不卡| 欧美激情在线有限公司| 狠狠干综合网| 亚洲网站视频福利| 亚洲淫性视频| 亚洲一级高清| 国产色综合网| 亚洲素人在线| 亚洲淫性视频| 久久这里只有| 亚洲视频免费看| 亚洲国产成人tv| 欧美另类女人| 精久久久久久| 欧美国产日韩xxxxx| 国产主播精品在线| 久久久久一区二区| 国产一级久久| 亚洲免费播放| 91久久夜色精品国产九色| 性欧美大战久久久久久久免费观看| 欧美一区二区福利在线| 欧美国产成人精品| 欧美一区二区私人影院日本| 午夜视频一区在线观看| 欧美激情aⅴ一区二区三区| 亚洲精品无人区| 亚洲国产精品久久精品怡红院| 午夜在线视频观看日韩17c| 欧美日韩免费观看一区二区三区| 最新日韩中文字幕| 亚洲国产精品一区制服丝袜 | 久久久欧美精品sm网站| 一区二区免费看| 亚洲高清自拍| 夜夜嗨av一区二区三区中文字幕| 国产精品wwwwww| 午夜电影亚洲| 久久久午夜视频| 亚洲国产成人午夜在线一区 | 欧美制服丝袜第一页| 久久亚洲视频| 亚洲精品国产精品国产自| 日韩视频二区| 妖精视频成人观看www| 欧美在线视频免费播放| 亚洲第一在线| 一区二区三区精品国产| 国产精品高潮呻吟久久av无限| 亚洲国产精品高清久久久| 欧美电影在线观看| 欧美韩日一区| 亚洲一区二区三区免费在线观看| 久久精品国产第一区二区三区最新章节 | 亚洲免费观看在线观看| 国产精品大片| 亚洲毛片一区| 午夜精品99久久免费| 亚洲一区欧美激情| 欧美一区二区三区免费视| 国产欧亚日韩视频| 亚洲日本aⅴ片在线观看香蕉| 亚洲激情电影中文字幕| 欧美一区二区日韩一区二区| 久久av一区二区三区| 在线观看亚洲视频| 一区二区不卡在线视频 午夜欧美不卡'| 亚洲精品乱码久久久久久黑人| 国产女优一区| 美女国内精品自产拍在线播放| 国产乱子伦一区二区三区国色天香 | 亚洲国产精品久久久久| 久久男人资源视频| 亚洲午夜激情在线| 国产精品久久久久久福利一牛影视| 午夜视频精品| 亚洲欧洲精品一区二区| 亚洲视频在线观看| 日韩视频一区二区在线观看 | 好吊妞这里只有精品| 欧美天天在线| 欧美午夜在线观看| 欧美激情视频一区二区三区不卡| 久久亚洲私人国产精品va媚药| 午夜精品福利在线观看| 久久免费视频这里只有精品| 美女精品在线观看| 国产欧美亚洲精品| 99一区二区| 亚洲视频一区| 欧美网站在线| 欧美成人r级一区二区三区| 欧美三级午夜理伦三级中视频| 香蕉成人久久| 久久男人av资源网站| 欧美日韩在线播放一区二区| 在线播放视频一区| 揄拍成人国产精品视频| 精品成人一区二区三区| 欧美日韩成人综合| 欧美人与性动交cc0o| 欧美日韩hd| 国内自拍一区| 国产亚洲在线观看| 国产欧美综合在线| 99国产精品久久| 欧美在线一二三四区| 久久精品欧美日韩精品| 国产精品99久久久久久久久久久久| 99在线观看免费视频精品观看| 午夜在线精品偷拍| 美女露胸一区二区三区| 国产精品视频1区| 在线免费高清一区二区三区| 在线精品在线| 久久国产欧美| 国产欧美日韩免费|