数据完整性
==数据完整性==用于定义和保护表内部或表之间数据的关系。有四种完整性:
域完整性
、
实体完整性
、
参照完整性
和
用户定义完整性
。
一、实体完整性
一个唯一约束要求一个字段或一组 字段的所有值互不相同,或者说唯一。
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);
结果如下: