SQLite学习(五)

数据完整性

==数据完整性==用于定义和保护表内部或表之间数据的关系。有四种完整性: 域完整性 实体完整性 参照完整性 用户定义完整性

一、实体完整性

一个唯一约束要求一个字段或一组 字段的所有值互不相同,或者说唯一。

NULL 和 UNIQUE:
问题1:如果一个字段已经声明为 UNIQUE,可以向这个字段插入多少个 NULL 值?
回答:与数据库的种类有关。PostgreSQL 和 Oracle 可以插入多个。Informix 和 Microsoft SQL Server只能一个。DB2、SQLAnywhere和Borland Inter-Base不能。SQLite采用了与PostgreSQL 和 Oracle 相同的解决方案。

问题2:两个 NULL 值是否相等?
回答:你没有足够的信息 来证明它们相等,但也没有足够的信息证明它们不等。 SQLite 的观点是假设所有的 NULL 都是不同的。所以你可以向唯一字段中插入任意多个 NULL 值。

在 SQLite 中,当你定义一个表时总要确定一个主键,不管你自己有没有定义。这个字段是 一个 64-bit 整型字段,称为 ROWID。它还有两个别名—— ROWID 和 OID,用这两个别名 同样可以取到它的值。它的默认取值按照增序自动生成。 SQLite 为主键字段提供自动增长 特性。

二、域完整性

保留字 DEFAULT为字段提供一个默认值。如果用 INSERT 语句插入记录时没有为该定做指定值,则为它赋默认值。DEFAULT不是一个约束 (constraint),因为它没有强制任何事情。 这所以把它归为域完整性,是因为它提供了处理 NULL 值的一个策略。

DEFAULT还可以接受 3 种预定义格式的 ANSI/ISO 预定字用于生成日期和时间值。
CURRENT_TIME 将会生成 ANSI/ISO 格式(HH:MM:SS)的当前时间。 CURRENT_DATE 会生成当前日期(格式为 YYYY-MM-DD)。 CURRENT_TIMESTAMP 会生成一个日期时间的组 合(格式为 YYYY-MM-DDHH:MM:SS)。

创建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);

插入数据:

sqlite> INSERT INTO times (id) VALUES (1);
sqlite> INSERT INTO times (id) VALUES (2);
sqlite> INSERT INTO times (id) VALUES (4);
结果如下: