Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenDocCN
lmpythw-zh
提交
91629f8d
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 搜索 >>
提交
91629f8d
编写于
8月 15, 2017
作者:
W
wizardforcel
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
ex43
上级
859e0157
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
127 addition
and
0 deletion
+127
-0
ex43.md
ex43.md
+127
-0
未找到文件。
ex43.md
0 → 100644
浏览文件 @
91629f8d
# 练习 43:SQL 管理
> 原文:[Exercise 43: SQL Administration](https://learncodethehardway.org/more-python-book/ex43.html)
> 译者:[飞龙](https://github.com/wizardforcel)
> 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
> 自豪地采用[谷歌翻译](https://translate.google.cn/)
“管理”一词在数据库中重载了。它的意思是“确保 PostgreSQL 服务器保持运行”,或者是“为新软件的部署更改和迁移表”。在本练习中,我只介绍如何更改和迁移简单的纲要。管理完整数据库服务器不在本书的范围之内。
## 销毁和更改表
您已经遇到了
`DROP TABLE`
作为删除表的方式。我将向您展示另一种使用方式,以及如何使用
`ALTER TABLE`
在表中添加或删除列。
```
sql
/* Only drop table if it exists. */
DROP
TABLE
IF
EXISTS
person
;
/* Create again to work with it. */
CREATE
TABLE
person
(
id
INTEGER
PRIMARY
KEY
,
first_name
TEXT
,
last_name
TEXT
,
age
INTEGER
);
/* Rename the table to peoples. */
ALTER
TABLE
person
RENAME
TO
peoples
;
/* Add a hatred column to peoples. */
ALTER
TABLE
peoples
ADD
COLUMN
hatred
INTEGER
;
/* Rename peoples back to person. */
ALTER
TABLE
peoples
RENAME
TO
person
;
.
schema
person
/* We don't need that. */
DROP
TABLE
person
;
```
我正在对表进行一些虚假更改,来演示这些命令,但使用
`ALTER TABLE`
和
`DROP TABLE`
语句,这是你可以在 SQLite3 中执行的一切事情。我会讲解它,让你了解发生了什么:
`ex21.sql:2`
使用
`IF EXISTS`
修饰符,仅当表已经存在时,才会丢弃。当你在没有表的新的数据库上运行你的
`.sql`
脚本时,这抑制了错误。
`ex21.sql:5`
仅仅重新创建表来处理它。
`ex21.sql:13`
使用
`ALTER TABLE`
来将其重命名为
`peoples`
。
`ex21.sql:16`
向新命名的表
`peoples`
中添加新的一列
`hatred`
,它是个
`INTEGER`
。
`ex21.sql:19`
将
`peoples`
重命名回到
`person`
,因为这对于表来说是个愚蠢的名称。
`ex21.sql:21`
转储
`person`
的纲要,所以你可以看到,它拥有新的
`hatred`
列。
`ex21.sql:24`
在这个练习之后,丢弃这个表来打扫干净。
## 迁移和演化数据
我们来应用您学到的一些技巧。我会让你选取你的数据库,并将纲要“演进”成不同的形式。你需要确保你很好地了解了以前的练习,并且让你的
`code.sql`
正常工作。如果你没有完成每一个这些东西,那么回去把所有东西都弄清楚。
为了确保你在正确的状态中尝试这个练习,当你运行你的
`code.sql`
,你应该可以运行
`.schema`
,像这样:
```
sql
$
sqlite3
ex13
.
db
<
code
.
sql
$
sqlite3
ex13
.
db
.
schema
CREATE
TABLE
person
(
id
INTEGER
PRIMARY
KEY
,
first_name
TEXT
,
last_name
TEXT
,
age
INTEGER
);
CREATE
TABLE
person_pet
(
person_id
INTEGER
,
pet_id
INTEGER
);
CREATE
TABLE
pet
(
id
INTEGER
PRIMARY
KEY
,
name
TEXT
,
breed
TEXT
,
age
INTEGER
,
dead
INTEGER
,
dob
DATETIME
);
```
确保你的表像我的表。并且如果不是,返回去并且移除任何命令,它们在上一个练习之后执行
`ALTER TABLE`
或者任何东西。
## 挑战性练习
您所要完成的任务是数据库更改的以下列表:
+
向
`person`
添加
`dead`
列,就像
`pets`
中那样。
+
向
`person`
添加
`phone_number`
列。
+
向
`person`
添加
`salary`
列,它是
`float`
。
+
向
`person`
和
`pet`
添加
`dob`
列,它是
`DATETIME`
。
+
向
`person_pet`
添加
`purchased_on`
列,它是
`DATETIME`
。
+
向
`pet`
添加
`parent`
列,它是
`INTEGER`
,并且持有它父母的
`id`
。
+
使用
`UPDATE`
语句,使用新的列数据更新现有的数据库记录。不要忘记
`person_pet`
关系表中的
`purchased_on`
列,来表明这个人什么时候购买这个宠物。
+
再增加四个人和五个宠物,并为它们分配从属关系,以及哪个宠物是父母。在最后一部分,请记住,您获取父母的 ID,然后将其设置在
`parent`
列中。
+
写一个查询,寻找 2004 年以后购买的所有宠物及其所有者的名字。关键是基于
`purchased_on`
列将
`person_pet`
映射到
`pet`
和
`parent`
。
+
写一个查询,寻找给定宠物的父母。再次查看
`pet.parent`
来实现它。实际上很简单,所以不要小题大做。
+
更新你的
`code.sql`
文件,你已经把所有的代码放了进去,让它使用
`DROP TABLE IF EXISTS`
语法。
+
使用
`ALTER TABLE`
,向
`person`
添加
`height`
和
`weight`
列,并将其放在你的
`code.sql`
文件中。
+
运行新的
`code.sql`
脚本来重置数据库,你应该没有错误。
您应该通过编写一个
`ex13.sql`
文件来实现,文件里面是这些新的东西。然后通过使用
`code.sql`
重置数据库来测试它,然后运行
`ex13.sql`
来更改数据库,并执行
`SELECT`
查询来确认您进行了正确的更改。
## 深入学习
继续阅读
[
`DROP TABLE`
](
https://sqlite.org/lang_droptable.html
)
和
[
`ALTER TABLE`
](
https://sqlite.org/lang_altertable.html
)
的文档,然后访问
[
SQLite3 语言页面
](
https://sqlite.org/lang的.html
)
,并且阅读文档的其余
`CREATE`
和
`DROP`
语句。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录