練習(xí) 41:SQL 更新
譯者:飛龍
協(xié)議:CC BY-NC-SA 4.0
自豪地采用谷歌翻譯
現(xiàn)在争群,你了解了 CRUD 的 CR 部分峰弹,還剩下更新和刪除操作店量。與所有其他 SQL 命令一樣,UPDATE
命令遵循類似于DELETE
的格式鞠呈,但它會(huì)更改行中的列融师,而不是刪除它們。
UPDATE person SET first_name = "Hilarious Guy"
WHERE first_name = "Zed";
UPDATE pet SET name = "Fancy Pants"
WHERE id=0;
SELECT * FROM person;
SELECT * FROM pet;
在上面的代碼中蚁吝,我將我的名字改為"Hilarious Guy"
旱爆,因?yàn)檫@更準(zhǔn)確。為了展示我的新綽號(hào)窘茁,我將我的獨(dú)角獸更名為"Fancy Pants"
疼鸟。他喜歡它。
這不應(yīng)該很難弄清楚庙曙,只是以防萬一,我拆解第一個(gè):
- 以
UPDATE
開始浩淘,這是你將要更新的表捌朴,這里是person
吴攒。 - 接下來使用
SET
來說明,哪些列應(yīng)該被設(shè)置為什么值砂蔽。只要你用逗號(hào)分隔洼怔,如first_name = "Zed", last_name = "Shaw"
,你可以按需更改盡可能多的列左驾。 - 然后指定一個(gè)
WHERE
子句镣隶,為每行提供一個(gè)SELECT
風(fēng)格的測試集。當(dāng)UPDATE
找到匹配時(shí)诡右,它執(zhí)行更新安岂,并會(huì)將列SET
為你規(guī)定的樣子。
復(fù)雜表的更新
在上一個(gè)練習(xí)中帆吻,我讓你使用UPDATE
執(zhí)行子查詢域那,現(xiàn)在我要求你,將所有我擁有的寵物的名稱更改為"Zed's Pet"
猜煮。
SELECT * FROM pet;
UPDATE pet SET name = "Zed's Pet" WHERE id IN (
SELECT pet.id
FROM pet, person_pet, person
WHERE
person.id = person_pet.person_id AND
pet.id = person_pet.pet_id AND
person.first_name = "Zed"
);
SELECT * FROM pet;
這是根據(jù)另一個(gè)表的信息更新一個(gè)表的方法次员。還有其他一些方法,可以做同樣的事情王带,但是這樣做是最容易理解淑蔚。
更新數(shù)據(jù)
我將向你展示一種插入數(shù)據(jù)的替代方式,有助于原子地替換一行愕撰。你不一定經(jīng)常需要它刹衫,但是如果必須替換整個(gè)記錄,并且不希望在不使用事務(wù)的情況下執(zhí)行更復(fù)雜的UPDATE盟戏,那么它將會(huì)有所幫助绪妹。
這里,我想用另一個(gè)人替換我的記錄柿究,但僅僅保留 ID邮旷。問題是我必須在事務(wù)中執(zhí)行DELETE/INSERT
才能使其成為原子,否則我需要執(zhí)行一個(gè)完整的UPDATE
蝇摸。
另一個(gè)更簡單的方法是使用REPLACE
命令婶肩,或者將其添加到INSERT
作為修飾符。這里有一些 SQL貌夕,我首先無法插入新的記錄律歼,然后我使用這兩種形式的REPLACE
來實(shí)現(xiàn)它:
/* This should fail because 0 is already taken. */
INSERT INTO person (id, first_name, last_name, age)
VALUES (0, 'Frank', 'Smith', 100);
/* We can force it by doing an INSERT OR REPLACE. */
INSERT OR REPLACE INTO person (id, first_name, last_name, age)
VALUES (0, 'Frank', 'Smith', 100);
SELECT * FROM person;
/* And shorthand for that is just REPLACE. */
REPLACE INTO person (id, first_name, last_name, age)
VALUES (0, 'Zed', 'Shaw', 37);
/* Now you can see I'm back. */
SELECT * FROM person;
挑戰(zhàn)練習(xí)
- 使用
UPDATE
,通過我的person.id
啡专,將我的名字改回"Zed"
险毁。 - 寫一個(gè)
UPDATE
,將任何死亡動(dòng)物重命名為"DECEASED"
。如果你嘗試說他們是"DEAD"
畔况,它會(huì)失敗鲸鹦,因?yàn)?SQL 會(huì)認(rèn)為你的意思是,將其設(shè)置為名為"DEAD"
的列跷跪,這不是你想要的馋嗜。 - 嘗試使用一個(gè)子查詢,比如在
DELETE
中吵瞻。 - 訪問 SQL As Understood By SQLite 頁面葛菇,并開始閱讀
CREATE TABLE
,DROP TABLE
橡羞,INSERT
眯停,DELETE
,SELECT
和UPDATE
的文檔尉姨。 - 嘗試在這些文檔中找到一些有趣的事情庵朝,并記錄你不明白的事情,以便你可以稍后研究它們又厉。