數(shù)據(jù)完整性
==數(shù)據(jù)完整性==用于定義和保護表內(nèi)部或表之間數(shù)據(jù)的關(guān)系。有四種完整性:
域完整性
糖驴、實體完整性
僚祷、參照完整性
和用戶定義完整性
佛致。
一、實體完整性
唯一約束
一個唯一約束要求一個字段或一組 字段的所有值互不相同辙谜,或者說唯一俺榆。
NULL 和 UNIQUE:
問題1:如果一個字段已經(jīng)聲明為 UNIQUE,可以向這個字段插入多少個 NULL 值?
回答:與數(shù)據(jù)庫的種類有關(guān)装哆。PostgreSQL 和 Oracle 可以插入多個罐脊。Informix 和 Microsoft SQL Server只能一個。DB2蜕琴、SQLAnywhere和Borland Inter-Base不能萍桌。SQLite采用了與PostgreSQL 和 Oracle 相同的解決方案。
問題2:兩個 NULL 值是否相等?
回答:你沒有足夠的信息 來證明它們相等凌简,但也沒有足夠的信息證明它們不等上炎。 SQLite 的觀點是假設(shè)所有的 NULL 都是不同的。所以你可以向唯一字段中插入任意多個 NULL 值雏搂。
主鍵約束
在 SQLite 中反症,當(dāng)你定義一個表時總要確定一個主鍵,不管你自己有沒有定義畔派。這個字段是 一個 64-bit 整型字段铅碍,稱為 ROWID。它還有兩個別名——ROWID和 OID线椰,用這兩個別名 同樣可以取到它的值胞谈。它的默認取值按照增序自動生成。 SQLite 為主鍵字段提供自動增長 特性憨愉。
二烦绳、域完整性
默認值
保留字 DEFAULT為字段提供一個默認值。如果用 INSERT 語句插入記錄時沒有為該定做指定值配紫,則為它賦默認值径密。DEFAULT不是一個約束 (constraint),因為它沒有強制任何事情躺孝。 這所以把它歸為域完整性享扔,是因為它提供了處理 NULL 值的一個策略。
DEFAULT還可以接受 3 種預(yù)定義格式的 ANSI/ISO 預(yù)定字用于生成日期和時間值植袍。
CURRENT_TIME 將會生成 ANSI/ISO 格式(HH:MM:SS)的當(dāng)前時間惧眠。 CURRENT_DATE 會生成當(dāng)前日期(格式為 YYYY-MM-DD)。CURRENT_TIMESTAMP 會生成一個日期時間的組 合(格式為 YYYY-MM-DDHH:MM:SS)于个。
創(chuàng)建times表:
sqlite> CREATE TABLE times (id int,
...> date NOT NULL DEFAULT CURRENT_DATE,
...> time NOT NULL DEFAULT CURRENT_TIME,
...> timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP);
插入數(shù)據(jù):
sqlite> INSERT INTO times (id) VALUES (1);
sqlite> INSERT INTO times (id) VALUES (2);
sqlite> INSERT INTO times (id) VALUES (4);
結(jié)果如下: