# 在 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 教程的这一部分中，我们将创建，删除和更改表。