表是SQL数据库的主要组织结构。它们由若干列组成,反映表中每一行或每条记录的各个属性。这样的数据组织的一个基本方面,重要的是人与关系数据库了解如何创建、更改和删除表。
在本指南中,我们将介绍如何用SQL创建表,以及如何修改和删除现有的表。
为了学习本指南,你需要一台运行某种使用SQL的关系数据库管理系统(RDBMS)的计算机。
注意:请注意,许多RDBMS使用它们自己独特的SQL实现。虽然本教程中概述的命令适用于大多数RDBMS,但如果你在MySQL以外的系统上测试它们,确切的语法或输出可能会有所不同。
你还需要一个装载了一些示例数据的数据库和表,可以在其中练习使用相关命令。
如果SQL数据库系统运行在远程服务器上,请从本地设备SSH到服务器:
ssh sammy@your_server_ip
然后打开MySQL服务器提示符,将==sammy==
替换为你的MySQL用户账户的名称:
mysql -u sammy -p
创建一个名为tablesDB
的数据库:
CREATE DATABASE tablesDB;
如果数据库成功创建,您将收到这样的输出:
OutputQuery OK, 1 row affected (0.01 sec)
要选择tablesDB
数据库,运行以下USE
语句:
USE tablesDB;
OutputDatabase changed
有了这些,你就可以开始学习如何在SQL中创建和管理表了。
要在SQL中创建表,使用CREATE TABLE
命令,后面跟上你想要的表名:
CREATE TABLE table_name;
请注意,与所有SQL语句一样,CREATE TABLE
语句必须以分号(;
)结尾。
这个示例语法将创建一个没有任何列的空表。要创建一个包含多列的表,在表名后面加上一列列名及其对应的数据类型和约束,用括号括起来,用逗号分隔:
CREATE TABLE table_name (
column1_name column1_data_type,
column2_name column2_data_type,
. . .
columnN_name columnN_data_type
);
例如,假设你想创建一个表来记录纽约市最喜欢的公园的一些信息。在决定要记录每个公园的哪些属性之后,接下来要确定每个属性的列名以及相应的数据类型:
parkName
:每个公园的名称。公园名称的长度有很大的差异,所以varchar
数据类型的最大长度为30
字符是合适的。yearBuilt
:公园建成的年份。虽然MySQL有year
数据类型,但只允许从1901
到2155
的值。纽约市有几个公园建于1901年之前,所以你可以使用int
数据类型。firstVisit
:第一次参观每个公园的日期。MySQL有date
数据类型,你可以用它来表示这一列。它以YYYY-MM-DD
的格式存储数据。lastVisit
:最近访问每个公园的日期。同样,你可以使用date
类型。要创建一个名为faveParks
的表,其中的列具有这些名称和数据类型,你可以运行以下命令:
CREATE TABLE faveParks (
parkName varchar(30),
yearBuilt int,
firstVisit date,
lastVisit date
);
OutputQuery OK, 0 rows affected (0.01 sec)
请记住,这只是创建了表的结构,因为没有向表中添加任何数据。
你也可以使用CREATE TABLE AS
语法从现有表中创建新表:
CREATE TABLE new_table_name AS (
SELECT column1, column2, . . . columnN
FROM old_table_name
);
在新表的名称后面跟着一列列及其数据类型,你在它后面跟着AS
,然后在括号中有一个SELECT
语句,该语句返回原始表中你想复制到新表中的任何列和数据。
注意,如果原表的列保存了任何数据,那么所有这些数据也会被复制到新表中。此外,为了清晰起见,这个示例语法包含了一个只包含必要的FROM
子句的SELECT
查询。然而,任何有效的SELECT
语句都可以在这个地方工作。
为了说明,下面的命令从之前创建的faveParks
表中的两列创建了一个名为parkInfo
的表:
CREATE TABLE parkInfo AS (
SELECT parkName, yearBuilt
FROM faveParks
);
OutputQuery OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
如果faveParks
表有任何数据,数据从其parkName
和yearBuilt
列将被复制到parkInfo
表,但在这种情况下两个表将是空的。
如果尝试使用已存在表的名称创建表,将导致错误:
CREATE TABLE parkInfo (
name varchar(30),
squareFootage int,
designer varchar(30)
);
OutputERROR 1050 (42S01): Table 'parkInfo' already exists
为了避免出现此错误,您可以在CREATE TABLE
命令中包含IF NOT EXISTS
选项。这将告诉数据库检查指定名称的数据库是否已经存在,如果存在,则发出警告而不是错误:
CREATE TABLE IF NOT EXISTS parkInfo (
name varchar(30),
squareFootage int,
designer varchar(30)
);
OutputQuery OK, 0 rows affected, 1 warning (0.00 sec)
这个命令仍然无法创建新表,因为名为parkInfo
的表仍然存在。但是请注意,这个输出表明CREATE TABLE
语句导致了一个警告。要查看警告消息,请运行诊断SHOW WARNINGS
语句:
SHOW WARNINGS;
Output| Level | Code | Message |
+-------+------+---------------------------------+
| Note | 1050 | Table 'parkInfo' already exists |
+-------+------+---------------------------------+
1 row in set (0.00 sec)
正如这个输出所示,你之前收到的相同错误已经被注册为警告,因为你包含了IF NOT EXISTS
选项。这在某些情况下很有用,比如运行事务时;错误将导致整个事务失败,而警告将意味着只有导致它的语句会失败。
有时您可能需要更改表的定义。这与更新表中的数据不同。相反,它涉及到改变表本身的结构。要做到这一点,你需要使用ALTER TABLE
语法:
ALTER TABLE table_name ALTER_OPTION sub_options . . . ;
开始的ALTER TABLE
语句之后,您指定的名称表你想改变。然后,传入RDBMS中可用的选项,执行你想要的修改。
例如,用户可能想要重命名表、添加新列、删除旧列或更改列的定义。您可以继续阅读并在前面创建表一节中创建的faveParks
表上练习这些示例。
改变faveParks
表的名称,您可以使用“重命名”语法。下面的例子将faveNYCParks
表的名字改为faveNYCParks
:
警告:重命名表时要小心。如果应用程序使用该表或数据库中的其他表引用它,那么这样做可能会导致问题。
ALTER TABLE faveParks RENAME TO faveNYCParks;
OutputQuery OK, 0 rows affected (0.01 sec)
要添加新列,需要传入ADD COLUMN
选项。下面的例子在faveNYCParks
表中添加了一个名为borough
的列,该列包含varchar
类型的数据,但最大长度为20
个字符:
ALTER TABLE faveNYCParks ADD COLUMN borough varchar(20);
OutputQuery OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
要从表中删除一列及其包含的任何数据,你可以使用DROP table
语法。这个示例命令删除borough
列:
ALTER TABLE faveNYCParks DROP COLUMN borough;
许多SQL实现允许你使用ALTER TABLE
来更改列的定义。下面的例子使用了MySQL的MODIFY COLUMN
子句,将yearBuilt
列的数据类型改为smallint
而不是原来的int
:
ALTER TABLE faveNYCParks MODIFY COLUMN yearBuilt smallint;
请注意,每个RDBMS都有不同的选项,可以通过ALTER TABLE
语句更改什么。为了全面了解你可以用ALTER TABLE
做什么,你应该查阅你的RDBMS的官方文档,了解它有哪些ALTER TABLE
选项。
以下是几个流行的开源数据库的官方文档:
ALTER TABLE
文档ALTER TABLE
文档ALTER TABLE
文档要删除一张表及其所有数据,使用DROP TABLE
语法:
警告:运行DROP TABLE
命令时要小心,因为它将永久删除表及其所有数据。
DROP TABLE table_name;
你可以使用DROP
语句删除多个表,用逗号和空格分隔表名,如下所示:
DROP TABLE table1, table2, table3;
为了说明,下面的命令将删除本文前面创建的faveNYCParks
和parkInfo
表:
DROP TABLE IF EXISTS faveNYCParks, parkInfo;
注意,这个例子包含了IF EXISTS
选项。这与CREATE TABLE
中可用的IF NOT EXISTS
选项的功能相反。在这种情况下,如果指定的表不存在,IF EXISTS
将导致DROP TABLE
语句返回一个警告而不是错误信息。
通过阅读本指南,您了解了如何在基于sql的数据库中创建、更改和删除表。这里列出的命令应该适用于任何使用SQL的数据库管理系统。记住,每种SQL数据库都使用自己独特的语言实现,因此要更完整地描述每个命令及其所有选项,应该查阅相应DBMS的官方文档。