# 练习 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`语句。
- 笨办法学 Python · 续 中文版
- 引言
- 第一部分:预备知识
- 练习 0:起步
- 练习 1:流程
- 练习 2:创造力
- 练习 3:质量
- 第二部分:简单的黑魔法
- 练习 4:处理命令行参数
- 练习 5:cat
- 练习 6:find
- 练习 7:grep
- 练习 8:cut
- 练习 9:sed
- 练习 10:sort
- 练习 11:uniq
- 练习 12:复习
- 第三部分:数据结构
- 练习 13:单链表
- 练习 14:双链表
- 练习 15:栈和队列
- 练习 16:冒泡、快速和归并排序
- 练习 17:字典
- 练习 18:性能测量
- 练习 19:改善性能
- 练习 20:二叉搜索树
- 练习 21:二分搜索
- 练习 22:后缀数组
- 练习 23:三叉搜索树
- 练习 24:URL 快速路由
- 第四部分:进阶项目
- 练习 25:xargs
- 练习 26:hexdump
- 练习 27:tr
- 练习 28:sh
- 练习 29:diff和patch
- 第五部分:文本解析
- 练习 30:有限状态机
- 练习 31:正则表达式
- 练习 32:扫描器
- 练习 33:解析器
- 练习 34:分析器
- 练习 35:解释器
- 练习 36:简单的计算器
- 练习 37:小型 BASIC
- 第六部分:SQL 和对象关系映射
- 练习 38:SQL 简介
- 练习 39:SQL 创建
- 练习 40:SQL 读取
- 练习 41:SQL 更新
- 练习 42:SQL 删除
- 练习 43:SQL 管理
- 练习 44:使用 Python 的数据库 API
- 练习 45:创建 ORM
- 第七部分:大作业
- 练习 46:blog
- 练习 47:bc
- 练习 48:ed
- 练习 49:sed
- 练习 50:vi
- 练习 51:lessweb
- 练习 52:moreweb