SQLite 创建,删除和更改表,本章我们将介绍 SQLite 数据库的数据定义语言(DDL)。 _DDL由定义数据库架构的 SQL 语句组成。 模式 _ 是以正式语言描述的数据库结构。 在关系数据库中,模式定义表,视图,索引,关系和触发器。
SQLite 支持以下三个 DDL 语句:
- 创造
- 更改表
- 下降
在 SQLite 中,CREATE
语句用于创建表,索引,视图和触发器。 ALTER TABLE
语句更改表的结构。 DROP
语句删除表,索引,视图或触发器。
SQLite 创建表
CREATE
语句用于创建表。 它还用于创建索引,视图和触发器。
要创建表,我们给表及其列命名。 每列可以具有以下数据类型之一:
- NULL —该值为 NULL 值
- INTEGER —有符号整数
- REAL —浮点值
- TEXT-文本字符串
- BLOB —数据块
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 ALTER TABLE
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);
在这里,我们看到了表的新结构。