成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

SQLite數據庫約束詳解

數據庫 其他數據庫
本文主要介紹了SQLite數據庫的約束,包括非空、唯一、主外鍵、條件檢查和默認約束等,并通過代碼的形式給出了詳細的解釋過程,希望能對讀者有所幫助。

一、約束 Constraints

SQLite數據庫中存儲數據的時候,有一些數據有明顯的約束條件。 比如一所學校關于教師的數據表,其中的字段列可能有如下約束:

年齡 - 至少大于20歲。如果你想錄入一個小于20歲的教師,系統會報錯.

國籍 - 默認中國。所謂默認,就是如果你不填寫,系統自動填上默認值.

姓名 - 不能為空。每個人都有名字嘛.

員工號 - 唯一。這個可不能亂,工資發錯了就麻煩了.

上面提到的大于、默認、不能為空、唯一等等,就是數據的約束條件。 我們在用CREATE TABLE 創建表的時候,就應該將每個字段列的約束條件事先說明(如果有的話), 以后再往表里輸入數據的時候,系統會自動為我們檢查是否滿足約束條件,如果不滿足系統會報錯。

SQLite 數據庫常用約束如下:

  • NOT NULL - 非空
  • UNIQUE - 唯一
  • PRIMARY KEY - 主鍵
  • FOREIGN KEY - 外鍵
  • CHECK - 條件檢查
  • DEFAULT - 默認

二、主鍵 PRIMARY KEY

我們還是進入SQLite 命令行環境,建立一個 test.db 數據庫用來做實驗,如下

 

  1. myqiao@ubuntu:~/My Documents/db$ sqlite3 test.db  
  2.  
  3. -- Loading resources from /home/myqiao/.sqliterc  
  4.  
  5. SQLite version 3.7.4  
  6.  
  7. Enter ".help" for instructions  
  8.  
  9. Enter SQL statements terminated with a ";"  
  10.  
  11. sqlite> .tables  
  12.  
  13. sqlite> 

 

運行 .tables 命令沒有返回,說明數據庫是空的。如果你的數據庫里面有內容并影響到下面的實驗, 你可以用我們上一篇學的 DROP TABLE 來刪除造成影響的表, 或者用ALTER TABLE ... RENAME TO ... 來改名。

下面言歸正轉,我們來說說主鍵 PRIMARY KEY 。

首先,數據表中每一條記錄都有一個主鍵, 這就像我們每的身份證號碼、員工號、銀行帳號; 反過來也可以說,每一個主鍵對應著一條數據記錄。 所以,主鍵必須是唯一的。

其次,一般情況下主鍵同時也是一個索引,所以通過主鍵查找記錄速度比較快。

第三,在關系型數據庫中,一個表的主鍵可以作為另外一個表的外鍵, 這樣,這兩個表之間就通過這個鍵建立了關系。

最后,主鍵一般是整數或者字符串,只要保證唯一就行。 在 SQLite 中,主鍵如果是整數類型,該列的值可以自動增長。

下面我們來做實驗:

 

  1. sqlite> 
  2.  
  3. sqlite> CREATE TABLE Teachers(Id integer PRIMARY KEY,Name text);  
  4.  
  5. sqlite> .tables  
  6.  
  7. Teachers  
  8.  
  9. sqlite> INSERT INTO Teachers(Name) Values('張三');  
  10.  
  11. sqlite> INSERT INTO Teachers(Name) Values('李四');  
  12.  
  13. sqlite> INSERT INTO Teachers(Name) Values('王二麻子');  
  14.  
  15. sqlite> SELECT * FROM Teachers;  
  16.  
  17. Id Name  
  18.  
  19. ---------- ----------  
  20.  
  21. 1 張三  
  22.  
  23. 2 李四  
  24.  
  25. 3 王二麻  
  26.  
  27. sqlite> INSERT INTO Teachers(Id,Name) Values(2,'孫悟空');  
  28.  
  29. Error: PRIMARY KEY must be unique  
  30.  
  31. sqlite> 

 

我們先新建了一個 Teachers 表,并設置了兩個字段列,其中 Id 字段列為主鍵列。 然后,我們向其中插入三條數據并查詢,反饋一切正常。

注意:在插入前三條數據的時候,命令中并沒有明確指明 Id 的值,系統自動賦值,并且數值自動增長。

插入第四條數據的時候,我給了一個明確的 Id 編號為 2,因為李四的編號已經是 2 了, 所以系統提示我錯誤:主鍵必須唯一。

三、默認值 DEFAULT

有一些特別的字段列,在每一條記錄中,他的值基本上都是一樣的。只是在個別情況下才改為別的值,這樣的字段列我們可以給他設一個默認值。

下面我們來做實驗:

 

  1. sqlite> 
  2.  
  3. sqlite> DROP TABLE Teachers;  
  4.  
  5. sqlite> .tables  
  6.  
  7. sqlite> 
  8.  
  9. sqlite> CREATE TABLE Teachers(Id integer PRIMARY KEY,Name text,Country text DEFAULT '中國');  
  10.  
  11. sqlite> .tables  
  12.  
  13. Teachers  
  14.  
  15. sqlite> INSERT INTO Teachers(Name) Values('張三');  
  16.  
  17. sqlite> INSERT INTO Teachers(Name) Values('李四');  
  18.  
  19. sqlite> INSERT INTO Teachers(Name) Values('王二麻子');  
  20.  
  21. sqlite> INSERT INTO Teachers(Name,Country) Values('孫悟空','天庭');  
  22.  
  23. sqlite> SELECT * FROM Teachers;  
  24.  
  25. Id Name Country  
  26.  
  27. ---- --------------- ---------------  
  28.  
  29. 1 張三 中國  
  30.  
  31. 2 李四 中國  
  32.  
  33. 3 王二麻子 中國  
  34.  
  35. 4 孫悟空 天庭  
  36.  
  37. sqlite> 

 

先把之前的 Teachers 表刪除,然后重新創建。這回 Teachers 表多了一個 Country 字段, 并且設置默認值為“中國”,然后我們插入四條數據到 Teachers 表。

前三條數據都沒有明確指明 Country 字段的值,只有第四條數據指明了“孫悟空”的 Country 為“天庭”。

查詢數據,發現前三條數據都填上了默認值,實驗成功。

數據顯示有點走樣,命令 .width 4 15 15 設置的列寬,可以通過 .show 查看, 可能是因為中文的原因,所以沒有對齊。

#p#

四、非空 NOT NULL

有一些字段我們可能一時不知到該填些什么,同時它也沒設定默認值, 當添加數據時,我們把這樣的字段空著不填,系統認為他是 NULL 值。但是還有另外一類字段,必須被填上數據,如果不填,系統就會報錯。 這樣的字段被稱為 NOT NULL 非空字段,需要在定義表的時候事先聲明。下面我們來做實驗:

 

  1. sqlite> 
  2.  
  3. sqlite> DROP TABLE Teachers;  
  4.  
  5. sqlite> .tables  
  6.  
  7. sqlite> 
  8.  
  9. sqlite> CREATE TABLE Teachers(Id integer PRIMARY KEY,Name text,Age integer NOT NULL,City text);  
  10.  
  11. sqlite> .tables  
  12.  
  13. Teachers  
  14.  
  15. sqlite> INSERT INTO Teachers(Name,Age) Values('Alice',23);  
  16.  
  17. sqlite> INSERT INTO Teachers(Name,Age) Values('Bob',29);  
  18.  
  19. sqlite> INSERT INTO Teachers(id,Name,Age) Values(6,'Jhon',36);  
  20.  
  21. sqlite> SELECT * FROM Teachers;  
  22.  
  23. Id Name Age City  
  24.  
  25. ---- --------------- --------------- ---------------  
  26.  
  27. 1 Alice 23 NULL  
  28.  
  29. 2 Bob 29 NULL  
  30.  
  31. 6 Jhon 36 NULL  
  32.  
  33. sqlite> INSERT INTO Teachers(Name) Values('Mary');  
  34.  
  35. Error: Teachers.Age may not be NULL  
  36.  
  37. sqlite> 

 

還是先刪除舊表,創建新表。

這回 Teachers 表聲明了一個 NOT NULL 字段 Age,同時還有一個可以為 NULL 的字段 City。

插入前三條數據都沒有指定 City 的值,查詢可以看到 City 字段全部為空。

注意:這里的 NULL 只是對“什么都沒有”的一種顯示形式, 可以通過 .nullvalue 命令改為別的形式。

插入第四條數據時沒有指定 Age 的值,系統就報錯了: Teachers.Age 不能為空。

五、 唯一 UNIQUE

這一約束很好理解,除了主列以為,還有一些列也不能有重復值。不多說,直接看代碼:

 

  1. sqlite> 
  2.  
  3. sqlite> DROP TABLE Teachers;  
  4.  
  5. sqlite> .tables  
  6.  
  7. sqlite> 
  8.  
  9. sqlite> CREATE TABLE Teachers(Id integer PRIMARY KEY,Name text UNIQUE);  
  10.  
  11. sqlite> .tables  
  12.  
  13. Teachers  
  14.  
  15. sqlite> INSERT INTO Teachers(Name) VALUES('Alice');  
  16.  
  17. sqlite> INSERT INTO Teachers(Name) VALUES('Bob');  
  18.  
  19. sqlite> INSERT INTO Teachers(Name) VALUES('Jane');  
  20.  
  21. sqlite> INSERT INTO Teachers(Name) VALUES('Bob');  
  22.  
  23. Error: column Name is not unique  
  24.  
  25. sqlite> 

 

這次的 Teachers 表只有 Name 這一列,但是 Name 列不能有重復值。可以看到,到我們第二次插入 Bob 時,系統就報錯了。

六、 條件檢查 CHECK

某些值必須符合一定的條件才允許存入,這是就需要用到這個 CHECK 約束。

 

  1. sqlite> 
  2.  
  3. sqlite> DROP TABLE Teachers;  
  4.  
  5. sqlite> .tables  
  6.  
  7. sqlite> 
  8.  
  9. sqlite> CREATE TABLE Teachers(Id integer PRIMARY KEY,Age integer CHECK(Age>22));  
  10.  
  11. sqlite> .tables  
  12.  
  13. Teachers  
  14.  
  15. sqlite> INSERT INTO Teachers(Age) VALUES(45);  
  16.  
  17. sqlite> INSERT INTO Teachers(Age) VALUES(33);  
  18.  
  19. sqlite> INSERT INTO Teachers(Age) VALUES(23);  
  20.  
  21. sqlite> INSERT INTO Teachers(Age) VALUES(21);  
  22.  
  23. Error: constraint failed  
  24.  
  25. sqlite> 

 

Age 字段要求必須大于 22,當插入的數據小于22時,系統報錯。

七、外鍵 FOREIGN KEY

現在,我們的數據庫中已經有 Teachers 表了,假如我們再建立一個 Students 表, 要求 Students 表中的每一個學生都對應一個 Teachers 表中的教師。

很簡單,只需要在 Students 表中建立一個 TeacherId 字段,保存對應教師的 Id 號, 這樣,學生和教師之間就建立了關系。

問題是:我們有可能給學生存入一個不在 Teachers 表中的 TeacherId 值, 而且發現不了這個錯誤。

這種情況下,可以把 Students 表中 TeacherId 字段聲明為一個外鍵, 讓它的值對應到 Teachers 表中的 Id 字段上。

這樣,一旦在 Students 表中存入一個不存在的教師 Id ,系統就會報錯。

 

  1. sqlite> 
  2.  
  3. sqlite> .tables  
  4.  
  5. Teachers  
  6.  
  7. sqlite> CREATE TABLE Students (Id integer PRIMARY KEY, TeacherId integer, FOREIGN KEY(TeacherId) REFERENCES Teachers(id) );  
  8.  
  9. sqlite> .tables  
  10.  
  11. Students Teachers  
  12.  
  13. sqlite> SELECT * FROM Teachers;  
  14.  
  15. Id Age  
  16.  
  17. ---- ---------------  
  18.  
  19. 1 40  
  20.  
  21. 2 33  
  22.  
  23. 3 23  
  24.  
  25. sqlite> INSERT INTO Students(TeacherId) VALUES(1);  
  26.  
  27. sqlite> INSERT INTO Students(TeacherId) VALUES(3);  
  28.  
  29. sqlite> INSERT INTO Students(TeacherId) VALUES(9);  
  30.  
  31. sqlite> SELECT * FROM Students;  
  32.  
  33. Id TeacherId  
  34.  
  35. ---- ---------------  
  36.  
  37. 1 1  
  38.  
  39. 2 3  
  40.  
  41. 3 9  
  42.  
  43. sqlite> 

 

這里建立了 Students 表,并且把 TeacherId 作為外鍵與 Teachers 表的 Id 列相對應。

關于SQLite數據庫的約束就介紹到這里,希望能給各位帶來幫助。

【編輯推薦】

  1. Linux平臺mysql的安裝配置之常用操作
  2. MySQL索引背后的數據結構及算法之基礎篇
  3. 利用mysql的audit審計功能記錄用戶操作信息
  4. 詳解Discuz_WIN7_Apache_MySQL_PHP平臺搭建
  5. NaviCat通過Http方式連接服務器的MySQL數據庫

 

責任編輯:趙鵬 來源: 博客園
相關推薦

2017-07-12 09:20:42

SQLite數據庫移植

2011-07-01 14:06:57

Qt sqlite

2011-07-26 18:11:56

iPhone Sqlite 數據庫

2011-07-27 10:16:41

iPhone SQLite 數據庫

2011-05-26 10:30:12

Oracle數據庫約束

2010-01-05 09:24:42

MySQL外鍵約束

2019-08-15 07:00:54

SQLite數據庫內存數據庫

2011-08-04 18:00:47

SQLite數據庫批量數據

2024-10-28 16:31:03

2011-08-02 16:16:08

iPhone開發 SQLite 數據庫

2011-07-05 10:16:16

Qt 數據庫 SQLite

2018-07-13 09:20:30

SQLite數據庫存儲

2011-08-24 13:49:45

Access數據庫轉化

2019-11-05 08:20:13

MySQL數據庫外鍵

2009-12-07 17:33:44

PHP SQlite數

2010-01-27 18:33:16

Android SQL

2011-08-30 14:15:34

QTSQLite數據庫

2010-03-04 15:31:44

Python SQLI

2013-04-01 10:49:51

iOS開發sqlite數據庫

2011-07-05 14:46:34

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美专区日韩 | 伊人久久在线 | 伊人伊人网 | 国产成人精品久久二区二区91 | 国产一区三区视频 | 亚洲高清在线观看 | 中文字幕免费在线 | 亚洲国产欧美一区 | 亚洲精品日日夜夜 | 久久九 | 伊人爽| 国产一区二区电影 | 欧美成人免费在线 | 玖操| 国产一区二区观看 | 日韩在线观看中文字幕 | 337p日韩 | 日韩高清中文字幕 | 在线免费中文字幕 | av天天澡天天爽天天av | 狠狠做深爱婷婷综合一区 | 国产精品色婷婷久久58 | 国产亚洲欧美在线 | 国产一区视频在线 | 91.色| 成人小视频在线观看 | 日韩在线观看视频一区 | 国产一区二区激情视频 | 一区二区三区在线观看视频 | 国产高清在线精品 | 精品自拍视频在线观看 | 久久一二三区 | 日韩电影免费在线观看中文字幕 | 国产精品久久一区二区三区 | 中文字幕乱码一区二区三区 | 欧美一区二区三区视频 | 精品欧美乱码久久久久久 | 怡红院免费的全部视频 | 91久久久久 | 天天拍天天草 | 日韩在线资源 |