亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > SQLite 入門教程三 好多約束 Constraints

SQLite 入門教程三 好多約束 Constraints

熱門標簽:智能電銷機器人教育 奧維地圖標注字體大小修改 電話機器人錄音師薪資 江西穩定外呼系統供應商 無錫梁溪公司怎樣申請400電話 高德地圖標注電話怎么沒了 北京智能外呼系統供應商家 孝感銷售電銷機器人廠家 中國地圖標注省份用什么符號

一、約束 Constraints

在上一篇隨筆的結尾,我提到了約束, 但是在那里我把它翻譯成了限定符,不太準確,這里先更正一下,應該翻譯成約束更貼切一點。 那么什么是約束呢?

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

年齡 - 至少大于20歲。如果你想錄入一個小于20歲的教師,系統會報錯
國籍 - 默認中國。所謂默認,就是如果你不填寫,系統自動填上默認值
姓名 - 不能為空。每個人都有名字嘛
員工號 - 唯一。這個可不能亂,工資發錯了就麻煩了
上面提到的大于、默認、不能為空、唯一等等,就是數據的約束條件。 我們在用 CREATE TABLE 創建表的時候,就應該將每個字段列的約束條件事先說明(如果有的話), 以后再往表里輸入數據的時候,系統會自動為我們檢查是否滿足約束條件,如果不滿足系統會報錯。


SQLite 常用約束如下

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

二、主鍵 PRIMARY KEY

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

復制代碼 代碼如下:

myqiao@ubuntu:~/My Documents/db$ sqlite3 test.db
-- Loading resources from /home/myqiao/.sqliterc
SQLite version 3.7.4
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .tables
sqlite> 

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


--------------------------------------------------------------------------------

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

首先,數據表中每一條記錄都有一個主鍵, 這就像我們每的身份證號碼、員工號、銀行帳號; 反過來也可以說,每一個主鍵對應著一條數據記錄。 所以,主鍵必須是唯一的。
其次,一般情況下主鍵同時也是一個索引,所以通過主鍵查找記錄速度比較快。
第三,在關系型數據庫中,一個表的主鍵可以作為另外一個表的外鍵, 這樣,這兩個表之間就通過這個鍵建立了關系。
最后,主鍵一般是整數或者字符串,只要保證唯一就行。 在 SQLite 中,主鍵如果是整數類型,該列的值可以自動增長。

--------------------------------------------------------------------------------

下面我們來做實驗

復制代碼 代碼如下:

sqlite> 
sqlite> CREATE TABLE Teachers(Id integer PRIMARY KEY,Name text);
sqlite> .tables
Teachers
sqlite> INSERT INTO Teachers(Name) Values('張三');
sqlite> INSERT INTO Teachers(Name) Values('李四');
sqlite> INSERT INTO Teachers(Name) Values('王二麻子');
sqlite> SELECT * FROM Teachers;
Id          Name     
----------  ----------
1           張三   
2           李四   
3           王二麻
sqlite> INSERT INTO Teachers(Id,Name) Values(2,'孫悟空');
Error: PRIMARY KEY must be unique
sqlite> 
      
--------------------------------------------------------------------------------

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

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

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

三、默認值 DEFAULT

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

下面我們來做實驗

復制代碼 代碼如下:

sqlite> 
sqlite> DROP TABLE Teachers;
sqlite> .tables
sqlite>
sqlite> CREATE TABLE Teachers(Id integer PRIMARY KEY,Name text,Country text DEFAULT '中國');
sqlite> .tables
Teachers
sqlite> INSERT INTO Teachers(Name) Values('張三');
sqlite> INSERT INTO Teachers(Name) Values('李四');
sqlite> INSERT INTO Teachers(Name) Values('王二麻子');
sqlite> INSERT INTO Teachers(Name,Country) Values('孫悟空','天庭');
sqlite> SELECT * FROM Teachers;
Id    Name             Country       
----  ---------------  ---------------
1     張三           中國        
2     李四           中國        
3     王二麻子     中國        
4     孫悟空        天庭
sqlite>

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

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

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

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

四、非空 NOT NULL

有一些字段我們可能一時不知到該填些什么,同時它也沒設定默認值, 當添加數據時,我們把這樣的字段空著不填,系統認為他是 NULL 值。

但是還有另外一類字段,必須被填上數據,如果不填,系統就會報錯。 這樣的字段被稱為 NOT NULL 非空字段,需要在定義表的時候事先聲明。

下面我們來做實驗

復制代碼 代碼如下:

sqlite> 
sqlite> DROP TABLE Teachers;
sqlite> .tables
sqlite>
sqlite> CREATE TABLE Teachers(Id integer PRIMARY KEY,Name text,Age integer NOT NULL,City text);
sqlite> .tables
Teachers
sqlite> INSERT INTO Teachers(Name,Age) Values('Alice',23);
sqlite> INSERT INTO Teachers(Name,Age) Values('Bob',29);
sqlite> INSERT INTO Teachers(id,Name,Age) Values(6,'Jhon',36);
sqlite> SELECT * FROM Teachers;
Id    Name             Age              City          
----  ---------------  ---------------  ---------------
1     Alice            23               NULL          
2     Bob              29               NULL          
6     Jhon             36               NULL          
sqlite> INSERT INTO Teachers(Name) Values('Mary');
Error: Teachers.Age may not be NULL
sqlite>

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

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

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

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

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

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

復制代碼 代碼如下:

sqlite> 
sqlite> DROP TABLE Teachers;
sqlite> .tables
sqlite>
sqlite> CREATE TABLE Teachers(Id integer PRIMARY KEY,Name text UNIQUE);
sqlite> .tables
Teachers
sqlite> INSERT INTO Teachers(Name) VALUES('Alice');
sqlite> INSERT INTO Teachers(Name) VALUES('Bob');
sqlite> INSERT INTO Teachers(Name) VALUES('Jane');
sqlite> INSERT INTO Teachers(Name) VALUES('Bob');
Error: column Name is not unique
sqlite>

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

六、 條件檢查 CHECK

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

復制代碼 代碼如下:

sqlite> 
sqlite> DROP TABLE Teachers;
sqlite> .tables
sqlite>
sqlite> CREATE TABLE Teachers(Id integer PRIMARY KEY,Age integer CHECK(Age>22));
sqlite> .tables
Teachers
sqlite> INSERT INTO Teachers(Age) VALUES(45);
sqlite> INSERT INTO Teachers(Age) VALUES(33);
sqlite> INSERT INTO Teachers(Age) VALUES(23);
sqlite> INSERT INTO Teachers(Age) VALUES(21);
Error: constraint failed
sqlite>

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

七、外鍵 FOREIGN KEY

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

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

--------------------------------------------------------------------------------

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

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

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

復制代碼 代碼如下:

sqlite>
sqlite> .tables
Teachers
sqlite> CREATE TABLE Students (Id integer PRIMARY KEY,  TeacherId integer,  FOREIGN KEY(TeacherId) REFERENCES Teachers(id) );
sqlite> .tables
Students  Teachers
sqlite> SELECT * FROM Teachers;
Id    Age           
----  ---------------
1     40            
2     33            
3     23
sqlite> INSERT INTO Students(TeacherId) VALUES(1);
sqlite> INSERT INTO Students(TeacherId) VALUES(3);
sqlite> INSERT INTO Students(TeacherId) VALUES(9);
sqlite> SELECT * FROM Students;
Id    TeacherId     
----  ---------------
1     1             
2     3             
3     9
sqlite>

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

問題來了:插入的前兩條數據沒問題,因為 Id 編號 1、3 都在 Teachers 表中; 但是數字 9 并不在 Teachers 表中,不但沒有報錯,系統還保存進去了,這是為什么呢?

據說 SQLite 的外鍵約束默認情況下并不是開啟的,如果你需要這個功能,你可能需要下載源代碼版本,設置每個編譯參數,然后重新編譯,這樣你就得到支持外鍵的 SQLite 了。

您可能感興趣的文章:
  • 讓Sqlite脫離VC++ Runtime獨立運行的方法
  • C++操作SQLite簡明教程
  • Sqlite 常用函數封裝提高Codeeer的效率
  • C#中使用SQLite數據庫的方法介紹
  • ASP.NET(C#)中操作SQLite數據庫實例
  • VC++基于Dx實現的截圖程序示例代碼
  • VC++實現輸出GIF到窗體并顯示GIF動畫的方法
  • VC++開發中完美解決頭文件相互包含問題的方法解析
  • 淺析VC++中的頭文件包含問題
  • VC++操作SQLite簡單實例

標簽:海北 泰州 通化 齊齊哈爾 荊州 那曲 臨滄 阜陽

巨人網絡通訊聲明:本文標題《SQLite 入門教程三 好多約束 Constraints》,本文關鍵詞  SQLite,入門教程,三,好多,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《SQLite 入門教程三 好多約束 Constraints》相關的同類信息!
  • 本頁收集關于SQLite 入門教程三 好多約束 Constraints的相關信息資訊供網民參考!
  • 推薦文章
    午夜在线观看视频免费 成人| 日韩欧美一二三区| 精品久久久久久影院免费| 久久国产影院| 日本伦理网站| 久草免费资源| 成人a大片高清在线观看| 欧美国产日韩在线| 欧美激情在线精品video| 日本特黄特色aaa大片免费| 一级毛片视频免费| 成人免费观看视频| 精品视频一区二区| 欧美爱爱动态| 99热精品在线| 午夜在线亚洲| 九九久久国产精品| 欧美激情一区二区三区中文字幕| 国产一级生活片| 欧美a级成人淫片免费看| 韩国三级视频网站| 精品视频在线看 | 日韩在线观看免费| 精品视频在线观看免费 | 欧美一区二区三区在线观看| 久久精品成人一区二区三区| 一a一级片| 国产成人啪精品| 日韩一级黄色| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 日韩av东京社区男人的天堂| 亚洲精品影院一区二区| 精品在线视频播放| 日韩在线观看免费完整版视频| 91麻豆爱豆果冻天美星空| 青青久久精品| 国产网站免费视频| 四虎影视库| 亚洲第一视频在线播放| 久久国产精品自线拍免费| 欧美激情一区二区三区中文字幕| 亚洲女初尝黑人巨高清在线观看| 国产91精品系列在线观看| 日韩专区亚洲综合久久| 一a一级片| 九九九在线视频| 久久国产精品自线拍免费| 国产亚洲精品成人a在线| 久久99爰这里有精品国产| 国产伦理精品| 99久久精品费精品国产一区二区| 青青青草视频在线观看| 国产极品精频在线观看| 成人免费网站视频ww| 久久久久久久久综合影视网| 国产成人精品影视| 黄视频网站在线看| 天天做日日爱夜夜爽| 久久99这里只有精品国产| 国产原创视频在线| 成人a级高清视频在线观看| 亚洲第一色在线| 日日爽天天| 久久久久久久网| 亚洲 激情| 国产一区免费在线观看| 欧美激情一区二区三区视频高清| 精品视频在线观看一区二区| 黄色免费三级| 国产精品1024永久免费视频| 国产一区二区精品久久91| 日韩av成人| 欧美激情一区二区三区视频 | 国产a视频| 国产一区二区精品久久91| 精品视频在线观看一区二区| 青青久久精品| 四虎影视库国产精品一区| 午夜在线亚洲| 九九热精品免费观看| 久久99中文字幕| 黄色福利片| 美女免费毛片| 久久久久久久久综合影视网| 亚洲爆爽| 欧美a级v片不卡在线观看| 一本高清在线| 国产综合成人观看在线| 国产成人精品综合久久久| 欧美a级v片不卡在线观看| 国产欧美精品午夜在线播放| 91麻豆国产| 美国一区二区三区| 久久精品店| 可以免费看污视频的网站| 韩国毛片| 香蕉视频久久| 日韩免费在线视频| 国产精品自拍一区| 美女免费精品高清毛片在线视| 日韩中文字幕在线播放| 欧美激情伊人| 精品久久久久久影院免费| 国产91丝袜高跟系列| 国产网站免费在线观看| 免费的黄色小视频| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 国产成人精品影视| 欧美爱色| 99色吧| 成人高清视频免费观看| 国产伦精品一区三区视频| 国产精品12| 国产成人精品综合久久久| 青青久久精品| 欧美日本国产| 可以免费看污视频的网站| 日韩综合| 欧美18性精品| 成人影视在线播放| 国产91精品一区| 一级毛片视频免费| 美女免费精品视频在线观看| 亚洲女人国产香蕉久久精品| 精品视频免费在线| 欧美激情一区二区三区在线| 欧美一级视频免费观看| 九九精品久久久久久久久| 日韩在线观看网站| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 韩国三级香港三级日本三级| 亚洲精品久久玖玖玖玖| 精品久久久久久影院免费| 九九九在线视频| 国产一区免费在线观看| 亚欧乱色一区二区三区| 日本特黄特黄aaaaa大片| 久久成人亚洲| 九九久久99| 国产一级生活片| 欧美激情一区二区三区在线| 毛片的网站| 可以免费看毛片的网站| 免费毛片播放| 久久精品成人一区二区三区| 国产一区二区精品久久91| 国产原创中文字幕| 亚洲第一视频在线播放| 九九精品久久久久久久久| 免费一级生活片| 成人免费观看的视频黄页| 美女免费毛片| 精品视频在线观看一区二区| 国产麻豆精品高清在线播放| 欧美大片aaaa一级毛片| 免费一级片网站| 午夜在线观看视频免费 成人| 精品国产一区二区三区免费| 精品在线免费播放| 韩国毛片免费| 国产一区二区高清视频| 国产国语对白一级毛片| 美国一区二区三区| 四虎影视久久久| 国产伦精品一区三区视频| 可以免费看毛片的网站| 免费国产在线观看不卡| 亚洲女初尝黑人巨高清在线观看| 国产一区二区精品久久| 四虎影视库国产精品一区| 日韩男人天堂| 国产极品白嫩美女在线观看看| 欧美1卡一卡二卡三新区| 国产精品免费久久| 国产视频久久久久| 亚洲第一色在线| 欧美大片a一级毛片视频| 99久久精品国产麻豆| 国产一区二区精品久久91| 99色吧| 999久久狠狠免费精品| 日韩中文字幕一区二区不卡| 精品国产亚洲人成在线| 999久久狠狠免费精品| 日本特黄一级| 久久成人亚洲| 中文字幕一区二区三区 精品| 麻豆午夜视频| 国产精品自拍亚洲| 香蕉视频一级| 日韩中文字幕一区| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 免费一级生活片| 香蕉视频久久| 免费毛片播放| 精品国产香蕉在线播出| 国产一区二区精品久| 亚飞与亚基在线观看| 99热精品在线| 欧美另类videosbestsex久久|