Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenDocCN
lmpythw-zh
提交
800729e4
L
lmpythw-zh
项目概览
OpenDocCN
/
lmpythw-zh
8 个月 前同步成功
通知
0
Star
18
Fork
5
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
L
lmpythw-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
800729e4
编写于
8月 15, 2017
作者:
W
wizardforcel
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
ex41
上级
7d230124
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
86 addition
and
0 deletion
+86
-0
ex41.md
ex41.md
+86
-0
未找到文件。
ex41.md
0 → 100644
浏览文件 @
800729e4
# 练习 41:SQL 更新
> 原文:[Exercise 41: Updating with SQL](https://learncodethehardway.org/more-python-book/ex41.html)
> 译者:[飞龙](https://github.com/wizardforcel)
> 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
> 自豪地采用[谷歌翻译](https://translate.google.cn/)
现在,您了解了 CRUD 的 CR 部分,还剩下更新和删除操作。与所有其他 SQL 命令一样,
`UPDATE`
命令遵循类似于
`DELETE`
的格式,但它会更改行中的列,而不是删除它们。
```
sql
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"`
,因为这更准确。为了展示我的新绰号,我将我的独角兽更名为
`"Fancy Pants"`
。他喜欢它。
这不应该很难弄清楚,只是以防万一,我拆解第一个:
+
以
`UPDATE`
开始,这是您将要更新的表,这里是
`person`
。
+
接下来使用
`SET`
来说明,哪些列应该被设置为什么值。只要您用逗号分隔,如
`first_name = "Zed", last_name = "Shaw"`
,您可以按需更改尽可能多的列。
+
然后指定一个
`WHERE`
子句,为每行提供一个
`SELECT`
风格的测试集。当
`UPDATE`
找到匹配时,它执行更新,并会将列
`SET`
为你规定的样子。
## 复杂表的更新
在上一个练习中,我让你使用
`UPDATE`
执行子查询,现在我要求你,将所有我拥有的宠物的名称更改为
`"Zed's Pet"`
。
```
sql
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
;
```
这是根据另一个表的信息更新一个表的方法。还有其他一些方法,可以做同样的事情,但是这样做是最容易理解。
## 更新数据
我将向您展示一种插入数据的替代方式,有助于原子地替换一行。您不一定经常需要它,但是如果必须替换整个记录,并且不希望在不使用事务的情况下执行更复杂的UPDATE,那么它将会有所帮助。
这里,我想用另一个人替换我的记录,但仅仅保留 ID。问题是我必须在事务中执行
`DELETE/INSERT`
才能使其成为原子,否则我需要执行一个完整的
`UPDATE`
。
另一个更简单的方法是使用
`REPLACE`
命令,或者将其添加到
`INSERT`
作为修饰符。这里有一些 SQL,我首先无法插入新的记录,然后我使用这两种形式的
`REPLACE`
来实现它:
```
sql
/* 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
;
```
## 挑战练习
+
使用
`UPDATE`
,通过我的
`person.id`
,将我的名字改回
`"Zed"`
。
+
写一个
`UPDATE`
,将任何死亡动物重命名为
`"DECEASED"`
。如果你尝试说他们是
`"DEAD"`
,它会失败,因为 SQL 会认为你的意思是,将其设置为名为
`"DEAD"`
的列,这不是你想要的。
+
尝试使用一个子查询,比如在
`DELETE`
中。
+
访问
[
SQL As Understood By SQLite
](
http://www.sqlite.org/lang.html
)
页面,并开始阅读
`CREATE TABLE`
,
`DROP TABLE`
,
`INSERT`
,
`DELETE`
,
`SELECT`
和
`UPDATE`
的文档。
+
尝试在这些文档中找到一些有趣的事情,并记录您不明白的事情,以便您可以稍后研究它们。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录