多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 在 SQLite 中创建,删除和更改表 > 原文: [http://zetcode.com/db/sqlite/tables/](http://zetcode.com/db/sqlite/tables/) 在 SQLite 教程的这一部分中,我们将介绍 SQLite 数据库的数据定义语言(DDL)。 DDL 由定义数据库架构的 SQL 语句组成。 模式是以正式语言描述的数据库结构。 在关系数据库中,模式定义表,视图,索引,关系和触发器。 SQLite 支持以下三个 DDL 语句: * `CREATE` * `ALTER` * `DROP` 在 SQLite 中,`CREATE`语句用于创建表,索引,视图和触发器。 `ALTER TABLE`语句更改表的结构。 `DROP`语句删除表,索引,视图或触发器。 ## SQLite 创建表 `CREATE`语句用于创建表。 它还用于创建索引,视图和触发器。 要创建表,我们给表及其列命名。 每列可以具有以下数据类型之一: * `NULL` — 该值为`NULL`值 * `INTEGER` — 有符号整数 * `REAL` — 浮点值 * `TEXT`- 文本字符串 * `BLOB` — 数据块 ```sql sqlite> CREATE TABLE Testing(Id INTEGER); sqlite> .schema Testing CREATE TABLE Testing(Id INTEGER); ``` 我们使用`CREATE TABLE`语句创建一个简单的`Testing`表。 `.schema`命令显示该表的形式定义。 ```sql sqlite> CREATE TABLE Testing(Id INTEGER); Error: table Testing already exists ``` 如果我们尝试创建一个已经存在的表,则会出现错误。 因此,`CREATE TABLE`语句具有可选的`IF NOT EXISTS`子句。 使用此子句不会做任何事情,我们不会收到任何错误。 ```sql sqlite> CREATE TABLE IF NOT EXISTS Testing(Id INTEGER); ``` 对于尝试创建一个已经存在的表,我们没有收到错误消息。 `CREATE TABLE` ... `AS`语句可基于`SELECT`语句创建新表。 ```sql sqlite> CREATE TABLE Cars2 AS SELECT * FROM Cars; ``` 上面的语句使用特定的`SELECT`语句创建与`Cars`表相同的表。 ```sql 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`。 ```sql 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`。 ```sql 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`语句用于从数据库中删除表。 ```sql 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`表。 ```sql sqlite> DROP TABLE Testing; Error: no such table: Testing ``` 尝试删除不存在的表会导致错误。 使用`IF EXISTS`子句,我们可以避免此错误。 ```sql sqlite> DROP TABLE IF EXISTS Testing; ``` 该语句仅在存在`Testing`表时才会删除。 ```sql sqlite> DROP TABLE IF EXISTS test2.Cars; ``` 该 SQL 语句从`test2`数据库中删除`Cars`表。 ## SQLite `ALTER TABLE` SQLite 支持`ALTER TABLE`语句的有限子集。 SQLite 中的此语句允许用户重命名表或向现有表添加新列。 无法重命名列,删除列或从表中添加或删除约束。 ```sql sqlite> CREATE TABLE Names(Id INTEGER, Name TEXT); ``` 让我们创建一个要重命名的表`Names`。 ```sql sqlite> ALTER TABLE Names RENAME TO NamesOfFriends; ``` 我们将表重命名为`NamesOfFriends`。 ```sql sqlite> .schema NamesOfFriends CREATE TABLE "NamesOfFriends"(Id INTEGER, Name TEXT); ``` 我们验证重命名表的架构。 假设我们要向表中添加一个新列。 ```sql sqlite> ALTER TABLE NamesOfFriends ADD COLUMN Email TEXT; ``` SQL 语句将名为`Email`的新列添加到表中。 ```sql sqlite> .schema NamesOfFriends CREATE TABLE "NamesOfFriends"(Id INTEGER, Name TEXT, Email TEXT); ``` 在这里,我们看到了表的新结构。 在 SQLite 教程的这一部分中,我们将创建,删除和更改表。