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:如果父行被删除,子行也被删除;如果父列被更新,新值会传播到子列。