日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Sqlite3中replace语句用法详解

發布時間:2024/7/23 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Sqlite3中replace语句用法详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在本例中使用如下數據庫表:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(圖 1)

該表的表名為student, 存儲學生信息。 所有字段的數據類型都是TEXT 。 其中id和name作為復合主鍵。 email字段加上了唯一約束。建表語句如下:?

CREATE TABLE IF NOT EXISTS student ("id" TEXT,"name" TEXT NOT NULL,"sex" TEXT,"email" TEXT UNIQUE,"fenshu" TEXT CHECK(fenshu > 0),"tecid" TEXT REFERENCES teacher(id),"class" TEXT, PRIMARY KEY(id, name) )

replace語句的行為

1 replace語句會刪除原有的一條記錄, 并且插入一條新的記錄來替換原記錄。

為了驗證這個結論, 下面打開Sqlite命令行, 執行以下語句來替換id為2的記錄。

sqlite> replace into student (id, name, sex, email, fenshu, tecid, class) values('2', 'lisi', '*F', '123456@qq.com', '80', '2', '1'); 執行完這條語句之后, student表中的數據變成下圖所示:

(圖 2)

對比圖1和圖2 , 可以發現: 在圖1中, id為2 的記錄是表中的第一條記錄, 當執行完上述的replace語句之后, id為2的記錄位于整張表的最后。 這就說明, 這條replace語句刪除了原有的id為2的記錄, 有插入了一條新的id為2的記錄。

2 一般用replace語句替換一條記錄的所有列, 如果在replace語句中沒有指定某列, 在replace之后這列的值被置空 。

下面我們還是以id為2 的記錄做實驗, 執行如下語句:

sqlite> replace into student (id, name, sex, email, fenshu, tecid) values ('2', 'lisi', '*F', '123456@qq.com', '80', '2'); 該語句還是替換id為2, name為lisi的記錄, 只是在指定列的時候, 沒有指定class列。 在執行完成之后, 表中的數據如下:

(圖 3)

對比圖2和圖3 , 可以看到, id為2, name為lisi的記錄的class字段沒有值。

3 replace根據主鍵確定被替換的是哪一條記錄

在該表中, 把id和name指定為復合主鍵。 在上面兩條語句執行的時候, 都在values中指定了id為2, name為lisi 。 執行之后看到的結果也是id為2, name為lisi的記錄被替換。 這就說明了replace語句根據主鍵的值確定被替換的是哪一條記錄。

4 replace語句不能根據where子句來定位要被替換的記錄

執行以下語句:

sqlite> replace into student (id, name, sex, email, fenshu, tecid) values ('2', 'lisi', '*F', '123456@qq.com', '80', '2') where id = '2'; 會報如下錯誤: Error: near "where": syntax error

5 如果執行replace語句時, 不存在要替換的記錄, 那么就會插入一條新的記錄。

在student表中, 我們讓id和name成為復合主鍵。 下面我們使用replace語句替換id為100, name為a 的記錄。 從圖3中可以看到, 表中存在name為a的記錄, 但是這條記錄的id為7, 而不是100 。也就是說 id為100, name為a 的記錄不存在。

執行如下語句:

sqlite> replace into student (id, name, sex, email, fenshu, tecid, class) values('100', 'a', '*F', '123456@qq.com', '80', '2', '1'); 執行完成之后, 表中的數據如下:

??(圖 4)

可以看到, 在表中插入了一條新的記錄。

6 如果新插入的或替換的記錄中, 有字段和表中的其他記錄沖突, 那么會刪除那條其他記錄。

上面的第5步同時也說明了這個問題。 對比圖4 和圖5 , 發現在插入一條新的id為100, name為a的記錄之后, 還刪除了id為2, name為lisi的記錄。 為什么會這樣呢? 我們在開始的時候說過, 表中的email字段加上了唯一約束。 id為2的記錄的email和新插入的id為100的記錄中的email相同, 都是123456@qq.com 。 這就導致違反唯一約束, 所以在插入id為100的記錄之前, 刪除了id為2的記錄。

下面再次驗證一下。 現在我們替換id為5, name為lisi3 的記錄, 將它的email替換為2@163.com 。 表中的id為5的記錄的email字段也是2@163.com , 所以會導致違反唯一約束。

執行下面的語句:

sqlite> replace into student (id, name, sex, email, fenshu, tecid, class) values('5', 'lisi3', 'F', '2@163.com', '80', '2', '1'); 執行完這條語句之后, 表中的數據如下圖:

(圖 5)

對比圖4 和 圖5 , 發現id為5的記錄被替換掉, 并且把這條記錄的email設置為2@163.com, 這和圖4中原有的id為6的記錄沖突, 所以導致id為6的記錄被刪除, 在圖5 中已經沒有id為6的那條記錄了。

replace語句和update語句的對比

對于update語句, 因為經常使用到,應該算比較熟悉。 下面對比一下update和replace語句的行為, 只是簡單陳述, 不再以具體實例說明。

update語句使用where子句定位被更新的記錄;

update語句可以一次更新一條記錄, 也可以更新多條記錄, 只要這多條記錄都復合where子句的要求;

update只會在原記錄上更新字段的值, 不會刪除原有記錄, 然后再插入新紀錄;

如果在update語句中沒有指定一些字段, 那么這些字段維持原有的值, 而不會被置空;


轉自:http://www.2cto.com/database/201404/292368.html

總結

以上是生活随笔為你收集整理的Sqlite3中replace语句用法详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。