如何在 SQL 中创建和管理表

介绍

表是 SQL 数据库的主要组织结构,它们包含一系列列,反映了表中的每个行或记录的个别属性。 作为数据组织的一个基本方面,任何使用关系数据库的人都必须了解如何根据需要创建、更改和删除表。

在本指南中,我们将讨论如何在 SQL 中创建表,以及如何修改和删除现有表。

前提条件

要遵循本指南,您需要运行某种类型的关系数据库管理系统(RDBMS)的计算机,该系统使用SQL。

  • 运行 Ubuntu 20.04 的服务器,有一个拥有行政权限的非根基用户和一个配置有 UFW 的防火墙,正如我们[初始的 Ubuntu 20.04 服务器设置指南(https://andsky.com/tech/tutorials/initial-server-setup-with-ubuntu-20-04)所描述的那样.
  • MySQL在服务器上安装并安全,概要载于[How To Install MySQL on Ubuntu 20.04] (https://andsky.com/tech/tutorials/how-to-install-mysql-on-ubuntu-20-04). 此指南由非根基 MySQL 用户进行校验,该用户使用 Step 3** 所描述的过程创建. .

注意:请注意,许多RDBMS使用自己的独特的SQL实现,虽然本教程中描述的命令将在大多数RDBMS上工作,但如果您在MySQL以外的系统上测试它们,精确的语法或输出可能会有所不同。

如果你没有这些,你可以阅读以下 连接到MySQL和设置示例数据库 部分,详细了解如何创建一个数据库和表,这本指南将用在整个示例中。

连接到MySQL并设置示例数据库

如果您的 SQL 数据库系统在远程服务器上运行,则从本地计算机输入 SSH 到服务器:

1[environment local]
2ssh sammy@your_server_ip

然后打开MySQL服务器提示,用您的MySQL用户帐户的名称代替sammy:

1mysql -u sammy -p

创建一个名为 tablesDB 的数据库:

1CREATE DATABASE tablesDB;

如果数据库创建成功,您将收到这样的输出:

1[secondary_label Output]
2Query OK, 1 row affected (0.01 sec)

若要選擇「tablesDB」資料庫,請執行下列「USE」聲明:

1USE tablesDB;
1[secondary_label Output]
2Database changed

有了它,您可以随时遵循本指南的其余部分,并开始学习如何在 SQL 中创建和管理表。

创建桌子

若要在 SQL 中创建表,请使用CREATE TABLE命令,然后为表提供您想要的名称:

1CREATE TABLE table_name;

请注意,与任何 SQL 语句一样,‘CREATE TABLE’ 语句必须以半栏(;)结束。

此示例语法将创建一个没有列的空表. 若要创建包含列的表,请按照列表名称列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表:

1CREATE TABLE table_name (
2column1_name column1_data_type,
3column2_name column2_data_type,
4. . .
5columnN_name columnN_data_type
6);

例如,假设您想要创建一个表格来记录您在纽约市最喜欢的公园的某些信息. 决定您想要记录每个公园的属性后,您将决定每个属性的列名以及每个属性的适当数据类型:

  • parkName: 每个公园的名称. 公园名称的长度差别很大,因此,最大长度为 " 30 " 字符的 " varchar " 数据类型是适当的。
  • " 建造年 " : 建园之年. 虽然MySQL有 " 年份 " 数据类型,但这只允许从 " 1901 " 到 " 2155 " 的数值。 纽约市在1901年之前建造了多座公园,因此你不妨使用`int'数据类型。
  • " 第一视觉 " : 你第一次参观每个公园的日期 MySQL 有您可能用于此列的 " 日期 " 数据类型。 它以`YYY-MM-DD'格式储存数据。
  • `最后访问 ' : 你最近访问每个公园的日期 再说一遍,你可以使用 " 日期 " 一词。 .

若要创建名为faveParks的表,其中包含这些名称和数据类型的列,则可以运行以下命令:

1CREATE TABLE faveParks (
2parkName varchar(30),
3yearBuilt int,
4firstVisit date,
5lastVisit date
6);
1[secondary_label Output]
2Query OK, 0 rows affected (0.01 sec)

请记住,这只会创建表的结构,因为您没有将任何数据添加到表中。

您还可以使用CREATE TABLE AS语法从现有表中创建新表:

1CREATE TABLE new_table_name AS (
2SELECT column1, column2, . . . columnN
3FROM old_table_name
4);

不要跟随新表的名称,列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表选择列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表列表。

请注意,如果原始表的列包含任何数据,那么所有这些数据都将被复制到新表中。 此外,为了澄清,本示例语法包含一个SELECT查询,其中只有所需的FROM条款。

为了说明,下面的命令会从以前创建的 faveParks 表中的两个列中创建一个名为parkInfo的表:

1CREATE TABLE parkInfo AS (
2SELECT parkName, yearBuilt
3FROM faveParks
4);
1[secondary_label Output]
2Query OK, 0 rows affected (0.02 sec)
3Records: 0 Duplicates: 0 Warnings: 0

如果faveParks表包含任何数据,则其parkNameyearBuilt列中的数据也会被复制到parkInfo表中,但在这种情况下,两个表都将是空的。

如果您尝试使用现有表的名称创建表,则会导致错误:

1CREATE TABLE parkInfo (
2name varchar(30),
3squareFootage int,
4designer varchar(30)
5);
1[secondary_label Output]
2ERROR 1050 (42S01): Table 'parkInfo' already exists

为了避免此错误,您可以在您的CREATE TABLE命令中包含IF NOT EXISTS选项,这将告诉数据库检查指定名称的数据库是否已经存在,如果有,则发出警告而不是错误:

1CREATE TABLE IF NOT EXISTS parkInfo (
2name varchar(30),
3squareFootage int,
4designer varchar(30)
5);
1[secondary_label Output]
2Query OK, 0 rows affected, 1 warning (0.00 sec)

此命令仍然无法创建新表,因为名为parkInfo的表仍然存在。 但是,请注意,此输出表示CREATE TABLE语句导致了警告。

1SHOW WARNINGS;
1[secondary_label Output]
2| Level | Code | Message                         |
3+-------+------+---------------------------------+
4| Note  | 1050 | Table 'parkInfo' already exists |
5+-------+------+---------------------------------+
61 row in set (0.00 sec)

正如此输出所示,您之前收到的相同错误已被注册为警告,因为您包含了如果不存在选项,这可能在某些情况下有用,例如在运行交易时;错误会导致整个交易失败,而警告只意味着导致它失败的陈述。

改变表格

有时你可能需要更改表的定义,这与更新表中的数据不同;相反,它涉及更改表本身的结构。

1ALTER TABLE table_name ALTER_OPTION sub_options . . . ;

在启动ALTER TABLE语句后,您将指定您想要更改的表的名称,然后,您将通过 RDBMS 中可用的任何选项,以执行您想的更改。

例如,您可能想更名表、添加新列、放下旧列或更改列的定义。 您可以继续阅读以便在以前创建的)部分。

若要更改「faveParks」表的名称,可以使用「RENAME TO」语法. 此示例将「faveParks」表的名称更改为「faveNYCParks」:

<$>[警告] 警告 :在重命名表时要小心,如果应用程序使用表或数据库中的其他表引用表,则可能会出现问题。

1ALTER TABLE faveParks RENAME TO faveNYCParks;
1[secondary_label Output]
2Query OK, 0 rows affected (0.01 sec)

若要添加新的列,您可以通过添加列选项。以下示例将名为borough的列添加到faveNYCParks表中,其中包含varchar类型的数据,但最大长度为20字符:

1ALTER TABLE faveNYCParks ADD COLUMN borough varchar(20);
1[secondary_label Output]
2Query OK, 0 rows affected (0.01 sec)
3Records: 0 Duplicates: 0 Warnings: 0

要从表中删除列和其中的任何数据,您可以使用DROP TABLE语法。

1ALTER TABLE faveNYCParks DROP COLUMN borough;

许多 SQL 实现允许您使用ALTER TABLE更改列的定义。以下示例使用 MySQL 的MODIFY COLUMN条款,更改yearBuilt列以使用smallint数据类型而不是原始的int类型:

1ALTER TABLE faveNYCParks MODIFY COLUMN yearBuilt smallint;

请注意,每个 RDBMS 都有不同的选项,您可以用ALTER TABLE 语句进行更改。 要了解您可以使用ALTER TABLE 完成的所有操作,您应该参阅 RDBMS 官方文档,了解其可用的ALTER TABLE 选项。

以下是有关几个流行的开源数据库的主题的官方文档:

删除表格

若要删除表及其所有数据,请使用DROP TABLE语法:

<$>[警告] 警告 :在运行DROP TABLE命令时要小心,因为它将永久删除您的表及其所有数据。

1DROP TABLE table_name;

您可以使用单个DROP语句删除多个表,如下,将它们的名称分隔成一个字符串和一个空格:

1DROP TABLE table1, table2, table3;

例如,下列命令会删除本指南中早些时候创建的faveNYCParksparkInfo表:

1DROP TABLE IF EXISTS faveNYCParks, parkInfo;

请注意,本示例中包含如果存在选项,此功能与如果不存在选项相反,可用于创建表。在这种情况下,如果存在,则会导致如果存在声明返回警告,而不是错误消息,如果指定的表之一不存在。

结论

通过阅读本指南,您了解如何在基于 SQL 的数据库中创建、更改和删除表. 这里描述的命令应该在使用 SQL 的任何数据库管理系统上工作。

如果您想了解更多有关使用SQL的工作,我们鼓励您查看本系列中的其他教程在 如何使用SQL

Published At
Categories with 技术
Tagged with
comments powered by Disqus