ZetCode

在 SQLite 中创建、删除和修改表

最后修改于 2020 年 7 月 6 日

在本 SQLite 教程中,我们将介绍 SQLite 数据库的数据定义语言 (DDL)。DDL 由定义数据库模式的 SQL 语句组成。模式是用正式语言描述的数据库结构。在关系数据库中,模式定义了表、视图、索引、关系和触发器。

SQLite 支持以下三种 DDL 语句

在 SQLite 中,CREATE 语句用于创建表、索引、视图和触发器。ALTER TABLE 语句更改表的结构。DROP 语句删除表、索引、视图或触发器。

SQLite 创建表

CREATE 语句用于创建表。它也用于创建索引、视图和触发器。

要创建表,我们给表及其列命名。每列都可以具有以下数据类型之一

sqlite> CREATE TABLE Testing(Id INTEGER);
sqlite> .schema Testing
CREATE TABLE Testing(Id INTEGER);

我们使用 CREATE TABLE 语句创建一个简单的 Testing 表。.schema 命令显示表的正式定义。

sqlite> CREATE TABLE Testing(Id INTEGER);
Error: table Testing already exists

如果我们尝试创建一个已存在的表,则会收到错误。因此,CREATE TABLE 语句有一个可选的 IF NOT EXISTS 子句。使用此子句,则什么也不做,并且我们不会收到错误。

sqlite> CREATE TABLE IF NOT EXISTS Testing(Id INTEGER);

对于尝试创建一个已存在的表,我们不会收到错误消息。

CREATE TABLE ... AS 语句允许基于 SELECT 语句创建新表。

sqlite> CREATE TABLE Cars2 AS SELECT * FROM Cars;

上面的语句使用特定的 SELECT 语句创建一个与 Cars 表相同的表。

sqlite> ATTACH DATABASE 'test2.db' AS test2;
sqlite> .databases
main: /home/janbodnar/tmp/test.db
test2: /home/janbodnar/tmp/test2.db

我们使用 ATTACH DATABASE 语句向当前数据库连接添加一个新的数据库。第一个数据库名为 main,新数据库名为 test2

sqlite> CREATE TABLE test2.Cars(Id INTEGER PRIMARY KEY, Name TEXT, Price INTEGER);
sqlite> INSERT INTO test2.Cars VALUES(1, 'Porsche', 107699);
sqlite> SELECT * FROM main.Cars WHERE Id=1;
1           Audi        52642     
sqlite> SELECT * FROM test2.Cars WHERE Id=1;
1           Porsche     107699   

由于我们有两个数据库,因此如果要在 test2 数据库中创建表,则必须指定数据库名称。数据库名称位于表名称之前。在这种情况下,如果未指定数据库名称,则会自动选择 main

sqlite> CREATE TEMPORARY TABLE Cars(Id INTEGER PRIMARY KEY, Name TEXT, Price INTEGER);
sqlite> INSERT INTO temp.Cars VALUES (1, 'Kia', 24300);
sqlite> .databases
main: /home/janbodnar/tmp/test.db
temp: 
test2: /home/janbodnar/tmp/test2.db
sqlite> SELECT * FROM temp.Cars WHERE Id=1;
Id          Name        Price     
----------  ----------  ----------
1           Kia         24300     
sqlite> 

使用 TEMPORARY 关键字,我们创建一个临时数据库。每次关闭数据库连接时,都会销毁临时数据库。临时数据库的名称为 temp

SQLite 删除表

DROP 语句用于从数据库中删除表。

sqlite> .tables
Authors       Cars2         Orders        temp.Cars   
Books         Customers     Reservations  test2.Cars  
Cars          Friends       Testing     
sqlite> DROP TABLE Testing;
sqlite> .tables
Authors       Cars          Customers     Orders        temp.Cars   
Books         Cars2         Friends       Reservations  test2.Cars  

我们使用 .tables 命令显示可用的表。DROP TABLE 语句从数据库中删除 Testing 表。

sqlite> DROP TABLE Testing;
Error: no such table: Testing

尝试删除一个不存在的表会导致错误。使用 IF EXISTS 子句,我们可以避免此错误。

sqlite> DROP TABLE IF EXISTS Testing;

此语句将仅在 Testing 表存在时才删除它。

sqlite> DROP TABLE IF EXISTS test2.Cars;

此 SQL 语句从 test2 数据库中删除 Cars 表。

SQLite 修改表

SQLite 支持 ALTER TABLE 语句的有限子集。此语句在 SQLite 中允许用户重命名表或向现有表中添加新列。无法重命名列、删除列或从表中添加或删除约束。

sqlite> CREATE TABLE Names(Id INTEGER, Name TEXT);

让我们创建一个名为 Names 的表,我们想要重命名它。

sqlite> ALTER TABLE Names RENAME TO NamesOfFriends;

我们将表重命名为 NamesOfFriends

sqlite> .schema NamesOfFriends
CREATE TABLE "NamesOfFriends"(Id INTEGER, Name TEXT);

我们验证重命名表的模式。

假设我们要向表中添加一个新列。

sqlite> ALTER TABLE NamesOfFriends ADD COLUMN Email TEXT;

SQL 语句向表中添加一个名为 Email 的新列。

sqlite> .schema NamesOfFriends
CREATE TABLE "NamesOfFriends"(Id INTEGER, Name TEXT, Email TEXT);

在这里,我们看到了表的新结构。

在本 SQLite 教程中,我们正在创建、删除和修改表。