SQLite | Insert、Delete、Updata 与 Drop 语句
文章目錄
- 1. 管理數(shù)據(jù)
- 1.1 插入數(shù)據(jù)
- 1.2 多行插入
- 1.3 測(cè)試外鍵
- 1.4 刪除數(shù)據(jù)
- 1.5 更新數(shù)據(jù)
- 1.6 刪除表格
- 參考資料
1. 管理數(shù)據(jù)
在上一篇文章中,我們介紹了如何創(chuàng)建一個(gè)數(shù)據(jù)庫(kù),充分考慮了表格設(shè)計(jì),列限制以及表的關(guān)系。而在本文中,我們將學(xué)習(xí) INSERT(插入)、DELETE(刪除)和 UPDATE(更新)記錄,事實(shí)上,這些操作比 SELECT 語(yǔ)句更簡(jiǎn)單。
1.1 插入數(shù)據(jù)
在一個(gè)關(guān)系數(shù)據(jù)庫(kù)中,數(shù)據(jù)只有在接收到記錄時(shí)才會(huì)產(chǎn)生。INSERT 正是將記錄插入數(shù)據(jù)庫(kù)的語(yǔ)句,你可以選擇只選擇某幾列來(lái)添加數(shù)據(jù),然后讓其他的保留缺失值 null 或者默認(rèn)值。
首先我們將會(huì)在上一篇文章建立的 SurgeTech 數(shù)據(jù)庫(kù)中插入數(shù)據(jù),首先導(dǎo)入數(shù)據(jù)庫(kù):
-
使用Jupyter Notebook 運(yùn)行 SQL 語(yǔ)句需安裝 ipython-sql
-
%sql 以及 %%sql 為在 Notebook 中運(yùn)行 SQL 語(yǔ)句,在 SQLite 命令行或 SQLite Stiduo 中不需要 %sql 或 %%sql
載入 SQL 以及連接 SQLite:
%load_ext sql %sql sqlite:///DataBase/surgetech_conference2.db 'Connected: @DataBase/surgetech_conference2.db' 圖1 SurgeTech Conference 數(shù)據(jù)庫(kù) Schema你可以將你的名字插入到數(shù)據(jù)庫(kù)中:
%%sql INSERT INTO attendee (first_name, last_name) VALUES('Thomas', 'Nield') * sqlite:///DataBase/surgetech_conference2.db 1 rows affected.可以看到,我們已經(jīng)將 ‘Thomas’,‘Nield’ 分別插入到了 FIRST_NAME 和 LAST_NAME,而由于 ATTENDEE_ID 設(shè)置了 ‘AUTOINCREMENT’(詳見(jiàn)上篇文章),因此自動(dòng)編號(hào)為 1 ,而 VIP 由于默認(rèn)值為 0 ,因此也具有數(shù)值,設(shè)下的 PHONE 和 EMAIL 則仍為缺失值。
事實(shí)上,在 SQLite 中設(shè)置 AUTOINCREMENT 是沒(méi)有必要的,只是在如 MySQL 等其他平臺(tái)才需要。因?yàn)樵?SQLite 中,只要一列數(shù)據(jù)是整形并且為主鍵,則當(dāng)有新的記錄時(shí)就會(huì)自動(dòng)編號(hào)
%%sql SELECT * from attendee| 1 | Thomas | Nield | None | None | 0 |
1.2 多行插入
如果你有一大串?dāng)?shù)據(jù)需要插入,但卻不想多次輸入時(shí),可以在 values 后面多次重復(fù),并且將每一行數(shù)據(jù)用逗號(hào)分隔開(kāi):
%%sql INSERT INTO attendee (first_name, last_name, phone, email, vip) VALUES ('Jon', 'Skeeter',4802185842,'john.skeeter@rex.net', 1), ('Sam','Scala',2156783401,'sam.scala@gmail.com', 0), ('Brittany','Fisher',5932857296,'brittany.fisher@outlook.com', 0) * sqlite:///DataBase/surgetech_conference2.db 3 rows affected.用這種方式插入數(shù)據(jù)將會(huì)更有效率一點(diǎn),尤其是當(dāng)你有成百上千條數(shù)據(jù)時(shí)。如果要在 Jave 或者 Python 中向數(shù)據(jù)庫(kù)插入表格數(shù)據(jù)的話,也應(yīng)該用這種方式,而不是多次循環(huán) insert 語(yǔ)句。
當(dāng)你需要將數(shù)據(jù)從一個(gè)表格轉(zhuǎn)移到另外一個(gè)表格時(shí),也可以利用 SELECT 查詢的結(jié)果插入到數(shù)據(jù)庫(kù)中,只要保證 SELECT 語(yǔ)句的列和數(shù)據(jù)類型于 INSERT 語(yǔ)句相同即可:
insert into ATTENDEE (first_name, last_name, phone, email) select first_name, last_name, phone, email from SOME_OTHER_TABLE1.3 測(cè)試外鍵
為了防止出現(xiàn)孤兒數(shù)據(jù)(Orphaned record),我們?cè)谏掀恼聞?chuàng)建數(shù)據(jù)庫(kù)時(shí)為多個(gè)表添加了外鍵限制,現(xiàn)在我們可以測(cè)試一下這些限制是否起作用了。
當(dāng)前 ATTENDEE 表中只有 ATTENDEE_ID 為 1~4 的數(shù)據(jù),為了測(cè)試外鍵限制是否起作用,我們可以試著在 COMPANY 表中添加 PRIMARY_CONTACT_ID 為 5 的數(shù)據(jù):
%%sql SELECT * FROM attendee * sqlite:///DataBase/surgetech_conference2.db Done.| 1 | Thomas | Nield | None | None | 0 |
| 2 | Jon | Skeeter | 4802185842 | john.skeeter@rex.net | 1 |
| 3 | Sam | Scala | 2156783401 | sam.scala@gmail.com | 0 |
| 4 | Brittany | Fisher | 5932857296 | brittany.fisher@outlook.com | 0 |
從 SQLite 3.6.19 開(kāi)始支持 外鍵約束
SQLite 默認(rèn)沒(méi)有打開(kāi)外鍵約束,若需要使用外鍵約束,需要設(shè)置 'PRAGMA foreign_keys = ON,如果沒(méi)有開(kāi)啟,即使原數(shù)據(jù)庫(kù)中支持外間約束,在添加數(shù)據(jù)時(shí)也不會(huì)進(jìn)行約束
%%sql PRAGMA foreign_keys = ON; INSERT INTO company (name, description, primary_contact_id) VALUES ('RexApp Solutions', 'A mobile app delivery service', 5) IntegrityError: (sqlite3.IntegrityError) FOREIGN KEY constraint failed [SQL: INSERT INTO company (name, description, primary_contact_id) VALUES ('RexApp Solutions', 'A mobile app delivery service', 5)] (Background on this error at: http://sqlalche.me/e/gkpj)可以看到,由于外鍵約束的存在,因此時(shí)無(wú)法向表 COMPANY 添加 PRIMARY_CONTACT_ID 為 5 的數(shù)據(jù)的,再試試 PRIMARY_CONTACT_ID 為 3:
%%sql INSERT INTO company (name, description, primary_contact_id) VALUES ('RexApp Solutions', 'A mobile app delivery service', 3) * sqlite:///DataBase/surgetech_conference2.db 1 rows affected.可以看到成功添加了。
1.4 刪除數(shù)據(jù)
DELETE 語(yǔ)句既簡(jiǎn)單又危險(xiǎn),你可以使用一行命令將一整個(gè)表的數(shù)據(jù)刪除:
%%sql DELETE FROM presentation_attendance * sqlite:///DataBase/surgetech_conference2.db 0 rows affected.然而由于外鍵約束,你無(wú)法刪除任何父表:
%%sql DELETE FROM attendee IntegrityError: (sqlite3.IntegrityError) FOREIGN KEY constraint failed [SQL: DELETE FROM attendee] (Background on this error at: http://sqlalche.me/e/gkpj)在使用 DELETE 語(yǔ)句時(shí),可以同時(shí)使用 WHERE 子句來(lái)篩選需要?jiǎng)h除的數(shù)據(jù),如果你想要?jiǎng)h除那些沒(méi)有手機(jī)號(hào)碼和電子郵箱的數(shù)據(jù),你可以:
%%sql PRAGMA foreign_keys = OFF; -- 關(guān)閉外鍵約束 DELETE FROM attendee WHERE phone IS null AND email IS null; * sqlite:///DataBase/surgetech_conference2.db Done. 1 rows affected.在 SQLite,使用 DELETE FROM attendee 來(lái)刪除表中的所有數(shù)據(jù),而在 MySQL 等其他平臺(tái)中,習(xí)慣用 TRUNCATE TABLE attendee 來(lái)刪除 attendee 表的數(shù)據(jù)
1.5 更新數(shù)據(jù)
終于,我們介紹到了 UPDATE 語(yǔ)句了,UPDATE 語(yǔ)句可以修改現(xiàn)有的記錄,如果我們想要將郵箱修改為大寫(xiě)的話,可以使用 UPPER() 函數(shù):
%%sql UPDATE attendee SET email = UPPER(email) * sqlite:///DataBase/surgetech_conference2.db 3 rows affected.我們也可以同時(shí)修改多個(gè)列,只需要在 set 表達(dá)式后面依次添加逗號(hào)就可以了,如同時(shí)將 first_name 和 last_name 改成大寫(xiě):
%%sql UPDATE attendee SET first_name = UPPER(first_name), last_name = UPPER(last_name) * sqlite:///DataBase/surgetech_conference2.db 3 rows affected.你也同樣可以在 UPDATE 語(yǔ)句中使用 WHERE 子句來(lái)篩選數(shù)據(jù),如將 attendee_id 為 3 和 4 的參會(huì)者設(shè)為 VIP:
%%sql UPDATE attendee SET vip = 1 WHERE attendee_id IN (3,4) * sqlite:///DataBase/surgetech_conference2.db 2 rows affected.1.6 刪除表格
可能有時(shí)候你想要將某個(gè)表格從數(shù)據(jù)庫(kù)中刪去,這是你只要使用 DROP TABLE 加上你想要?jiǎng)h除的表就可以了(注意這將會(huì)永久的將表刪去):
DROP TABLE MY_UNWANTED_TABLE參考資料
[1] Thomas Nield.Getting Started with SQL[M].US: O’Reilly, 2016: 91-95
相關(guān)文章:
SQL | 目錄
SQLite | SQLite 與 Pandas 比較篇之一
SQLite | Select 語(yǔ)句
SQLite | Where 子句
SQLite | Group by 與 Order by 子句
SQLite | CASE 子句
SQLite | Join 語(yǔ)句
SQLite | 數(shù)據(jù)庫(kù)設(shè)計(jì)與 Creat Table 語(yǔ)句
總結(jié)
以上是生活随笔為你收集整理的SQLite | Insert、Delete、Updata 与 Drop 语句的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 吴思涵国内首场肿瘤ecDNA学术报告|深
- 下一篇: 人群频率 | gnomAD数据库简介 (