# 練習 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