SQLite3的有用提示

来自泡泡学习笔记
BrainBs讨论 | 贡献2024年1月15日 (一) 10:20的版本 (创建页面,内容为“ 以下是关于SQLite3的一些有用的提示: <br> == 创建好的表 == 在表中使用<code>INTEGER PRIMARY KEY AUTOINCREMENT</code>作为一列是一个很好的主意。这确保了两件事: * <code>INTEGER PRIMARY KEY</code>:通过重用SQLite3内置的<code>rowid</code>列来提高性能。 * <code>AUTOINCREMENT</code>:未来的行将不会具有与已删除的旧行相同的ID。这可以防止潜在的错误和安全漏洞。 <br> 如…”)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳到导航 跳到搜索

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