SQLite3的有用提示
跳到导航
跳到搜索
以下是关于SQLite3的一些有用的提示:
创建好的表
在表中使用INTEGER PRIMARY KEY AUTOINCREMENT
作为一列是一个很好的主意。这确保了两件事:
INTEGER PRIMARY KEY
:通过重用SQLite3内置的rowid
列来提高性能。AUTOINCREMENT
:未来的行将不会具有与已删除的旧行相同的ID。这可以防止潜在的错误和安全漏洞。
如果你不使用INTEGER PRIMARY KEY
,那么你必须在所有主键列中使用NOT NULL
。否则,你将成为SQLite3的一个bug的受害者,该bug允许主键为NULL
。
任何具有INTEGER PRIMARY KEY
的列在将其值设置为NULL
时都会自动递增。但是,如果没有AUTOINCREMENT
,这种行为只能确保与当前存在的行的唯一性。
应该注意的是,NULL
值彼此之间被视为唯一的。在使用UNIQUE
约束或其他相等性测试时,这会有影响。
默认值
当一个列有DEFAULT
值时,只有在INSERT
语句没有指定值时才会应用它。如果INSERT
语句指定了一个NULL
值,则不会使用DEFAULT
值。
外键
如果子列的值为NULL
,则不会强制实施外键约束。为了确保关系始终得到实施,请在子列上使用NOT NULL
。
示例:
CREATE TABLE comments (value TEXT, user_id INTEGER NOT NULL REFERENCES users);
外键子句可以跟随ON DELETE
和/或ON UPDATE
,可能的值如下:
SET NULL
:如果父列被删除或更新,子列变为NULL
。- 注意:如果子列具有
NOT NULL
,这仍然会导致约束冲突。
- 注意:如果子列具有
SET DEFAULT
:如果父列被更新或删除,子列变为其默认值。- 注意:如果子列的默认值与实际父行不对应,这仍然会导致约束冲突。
CASCADE
:如果父行被删除,子行也被删除;如果父列被更新,新值会传播到子列。