SQLite 创建、修改、删除表并举例

⚡ 智能摘要

SQLite 表管理依赖于三个数据定义命令:CREATE TABLE 用于定义表,ALTER TABLE 用于重命名表或添加和更改列,DROP TABLE 用于从数据库中彻底删除表。

  • 📐 创建表: CREATE TABLE 语句定义表名及其列,每列都需要一个名称和一个数据类型。
  • 🛡️ 避免错误: 在 CREATE TABLE 语句中添加 IF NOT EXISTS,或在 DROP TABLE 语句中添加 IF EXISTS,可以防止因表已存在或表缺失而导致的错误。
  • ✏️ 修改表格: ALTER TABLE 语句用于重命名表、添加列,并且在现代 SQL Server 中,ALTER TABLE 语句还用于在 SQL Server 中实现其他功能。 SQLite 重命名或删除单个列。
  • 🗑️ 删除表: DROP TABLE 命令会永久删除表及其所有行和索引。
  • 📑 复制表格: CREATE TABLE AS SELECT 根据查询返回的列和行创建一个新表。
  • 🤖 人工智能辅助: AI 文本转 SQL 助手和 GitHub Copilot 可以根据简单的英语提示生成 CREATE、ALTER 和 DROP 语句。

SQLite 创建修改删除表

以下各节将介绍如何创建表、修改表结构以及删除表。 SQLite3. 通过示例介绍 CREATE TABLE、ALTER TABLE 和 DROP TABLE 命令。

SQLite 创建表格

句法

以下是 CREATE TABLE 语句的语法。

CREATE TABLE table_name(
column1 datatype,
column1 datatype
);

要创建表,您应该使用“CREATE TABLE”查询,如下所示:

CREATE TABLE guru99 (
  Id Int,
  Name Varchar
);

在表名后的两个括号内,定义表的列,每列应具有以下属性:

  • 名称,列名在表的列中应该是唯一的。
  • 数据类型——列数据类型。
  • 可选列约束,我们将在本教程的后续章节中进行解释。

SQLite 如果表不存在则创建表

当脚本运行多次时,如果表已存在,则普通的 CREATE TABLE 语句会失败并报错停止。 SQLite 它使用可选的 IF NOT EXISTS 子句解决了这个问题,该子句仅在表不存在时创建表,而当表已存在时则不执行任何操作。

CREATE TABLE IF NOT EXISTS guru99 (
  Id Int,
  Name Varchar
);

上述语句永远不会引发“表已存在”错误,因此可以安全地将其放在设置或迁移脚本的顶部。

删除表时,原理相同。在 DROP TABLE 语句中添加 IF EXISTS 可以避免因表已存在而导致的错误:

DROP TABLE IF EXISTS guru99;

这两个条款在自动化脚本中都很常见,因为它们允许同一个文件重复运行,而无需在运行之间进行手动清理。

放下桌子

要删除表,请使用“DROP TABLE”命令,后跟表名,如下所示:

DROP TABLE guru99;

改变表格

您可以使用“ALTER TABLE”命令重命名表,如下所示:

ALTER TABLE guru99 RENAME TO guru100;

要验证表名是否已更改,可以使用命令“.tables”显示表列表,表名现在应该已更改为如下所示:

SQLite .tables 输出显示表名已从 guru99 重命名为 guru100

如您所见,执行“alter table”命令后,表名“guru99”已更改为“guru100”。

SQLite 添加列 - 使用 ALTER TABLE 命令

您还可以使用“ALTER TABLE”命令添加列:

ALTER TABLE guru100 ADD COLUMN Age INT;

这将修改“guru100”表,并向其中添加一列“年龄”。

如果没有看到任何输出,则表示语句执行成功,列已添加。没有输出意味着光标将位于“sqlite>”之后,后面没有任何文本,如下所示:

SQLite 成功执行 ALTER TABLE ADD COLUMN 命令后,命令行没有显示任何输出。

但是,为了验证列是否已添加,我们可以使用命令“.schema guru100”。这将显示表定义,您应该可以看到我们刚刚添加的新列:

SQLite .schema guru100 输出显示了添加到表中的新 Age 列

SQLite ALTER TABLE:重命名和删除列

除了增加一列之外,现代版本 SQLite 还可以重命名单个列或删除列。重命名列的功能自 [版本号] 起可用。 SQLite 3.25,它会更新表定义中的名称,以及引用该列的每个索引、触发器和视图中的名称。

ALTER TABLE guru100 RENAME COLUMN Name TO FullName;

要删除一列, SQLite 3.35 及更高版本支持直接使用 DROP COLUMN 子句:

ALTER TABLE guru100 DROP COLUMN Age;

当列是主键、唯一约束或索引的一部分时,无法删除该列。在旧版本中, SQLite 对于缺少 DROP COLUMN 的版本,经典的解决方法是创建一个包含所需列的新表,将行复制过去,删除旧表,最后重命名新表。

如何在……中复制表格 SQLite 使用 CREATE TABLE AS SELECT

有时您需要一份表的副本,无论是作为进行风险更改前的备份,还是作为创建新表的起点。 SQLite 它使用 CREATE TABLE AS SELECT 一步构建完成,该语句创建一个新表,其列来自查询,并用查询返回的行填充该表。

CREATE TABLE guru100_backup AS SELECT * FROM guru100;

新表“guru100_backup”接收来自“guru100”表的相同列和每一行数据。要仅复制某些行,请在 SELECT 语句中添加 WHERE 子句:

CREATE TABLE known_ages AS SELECT * FROM guru100 WHERE Age IS NOT NULL;

需要记住的一点是,CREATE TABLE AS SELECT 会复制列名、类型和数据,但不会复制主键、其他约束或索引。如果副本必须强制执行与原始表相同的规则,则需要自行将这些信息添加到新表中。

SQLite 将值插入表中

要向表中插入值,我们使用“INSERT INTO”语句,如下所示:

INSERT INTO Tablename(colname1, colname2, ….) VALUES(valu1, value2, ….);

可以省略表名后的列名,如下写:

INSERT INTO Tablename VALUES(value1, value2, ….);

在这种情况下,如果您从表中省略列名,则插入的值的数量必须与表的列数完全相同。然后每个值都将插入到对应的列中。例如,对于以下插入语句:

INSERT INTO guru100 VALUES(1, 'Mike', 25);

该语句的结果如下:

SQLite 使用 INSERT INTO 语句向 guru100 表中添加一行值

  • 值 1 将被插入到“id”列中。
  • 值“Mike”将被插入到“姓名”列中,
  • 值 25 将被插入到“年龄”列中。

INSERT … DEFAULT VALUES 语句

您可以一次性使用列的默认值填充表,如下所示:

INSERT INTO Tablename DEFAULT VALUES;

如果某一列不允许空值或默认值,则会收到“该列的 NOT NULL 约束失败”的错误提示。如下所示:

SQLite INSERT DEFAULT VALUES 语句执行时出现 NOT NULL 约束失败错误

常见问题

序号 SQLite 没有 TRUNCATE TABLE 命令。要清空表,请运行不带 WHERE 子句的 DELETE FROM table_name 语句,然后使用 VACUUM 语句回收释放的磁盘空间。表结构及其列将保持不变。

DELETE 语句会从表中删除行,但会保留表、列及其结构,以便添加新数据。DROP TABLE 语句会删除整个表,包括其定义、索引和触发器,因此该表将不再存在于数据库中。

在 SQLite 在命令行中,`.tables` 点命令会打印出所有表名。在 SQL 中,可以使用 `SELECT name FROM sqlite_master WHERE type = 'table';` 查询内置模式表,该语句也适用于任何连接到数据库的应用程序。

临时表使用 CREATE TEMP TABLE 或 CREATE TEMPORARY TABLE 语句创建。它仅对创建它的数据库连接可见,并在连接关闭时自动删除,因此非常适合用于保存中间查询结果。

是的。主键是可选的。 SQLite当你漏掉其中一个时, SQLite 表中仍然保留一个隐藏的 64 位 rowid,用于标识每一行。定义表时,诸如 PRIMARY KEY、UNIQUE 和 NOT NULL 之类的列约束都是可选的。

默认情况下否。 SQLite 使用动态类型ping 具有类型亲和性,因此列可以接受几乎任何类型的值,而无需考虑其声明的类型。要强制执行严格检查,请将表创建为 STRICT 表,并将其添加到 SQLite 3.37.

是的。AI文本转SQL助手可以将您对数据的英文描述转换成包含列、数据类型和键的CREATE TABLE语句。如果您向模型提供现有的数据模式,准确率会更高,因为它可以重用实际的表名和列名。

是的。 GitHub 副驾驶 建议使用 ALTER TABLE、DROP TABLE 等命令。 SQLite 编辑器中的内联语句,例如 VS Code它会读取您的迁移文件和现有查询,因此其补全结果与您的实际表名和列名相匹配。

总结一下这篇文章: