【SQL 必知必会】- 第十七课 创建和操纵表

目录

17.1 创建表

        17.1.1 表创建基础

        替换现有的表

        17.1.2 使用NULL值

        主键和NULL 值

        理解NULL

        17.1.3 指定默认值

        使用DEFAULT 而不是NULL 值

17.2 更新表

        小心使用ALTER TABLE

17.3 删除表

        使用关系规则防止意外删除

17.4 重命名表

17.5 小结


        这一课讲授创建、更改和删除表的基本知识。

17.1 创建表

        用程序创建表,可以使用SQL 的CREATE TABLE 语句。需要注意的是,使用交互式工具时实际上就是使用SQL 语句。这些语句不是用户编写的,界面工具会自动生成并执行相应的SQL 语句(更改已有的表时也是这样)。

        17.1.1 表创建基础

        利用CREATE TABLE 创建表,必须给出下列信息:

  • 新表的名字,在关键字CREATE TABLE 之后给出;
  • 表列的名字和定义,用逗号分隔;
  • 有的DBMS 还要求指定表的位置。

        下面的SQL 语句创建本书中所用的Products 表:

CREATE TABLE Products
(
    prod_id CHAR(10) NOT NULL,
    vend_id CHAR(10) NOT NULL,
    prod_name CHAR(254) NOT NULL,
    prod_price DECIMAL(8,2) NOT NULL,
    prod_desc VARCHAR(1000) NULL
);

        不同DBMS 的CREATE TABLE 的语法有所不同,这个简单脚本也说明了这一点。这条语句在Oracle、PostgreSQL、SQL Server 和SQLite中有效,而对于MySQL,varchar 必须替换为text;对于DB2,必须从最后一列中去掉NULL。这就是对于不同的DBMS,要编写不同的表创建脚本的原因。


        替换现有的表

        在创建新的表时,指定的表名必须不存在,否则会出错。防止意外覆盖已有的表,SQL 要求首先手工删除该表(请参阅后面的内容),然后再重建它,而不是简单地用创建表语句覆盖它。


        17.1.2 使用NULL值

        NULL 值就是没有值或缺值。允许NULL 值的列也允许在插入行时不给出该列的值。不允许NULL 值的列不接受没有列值的行,换句话说,在插入或更新行时,该列必须有值。

        每个表列要么是NULL 列,要么是NOT NULL 列,这种状态在创建时由表的定义规定。

CREATE TABLE Orders
(
    order_num INTEGER NOT NULL,
    order_date DATETIME NOT NULL,
    cust_id CHAR(10) NOT NULL
);

        如果插入没有值的列,将返回错误,且插入失败。下一个例子将创建混合了NULL 和NOT NULL 列的表:

CREATE TABLE Vendors
(
    vend_id CHAR(10) NOT NULL,
    vend_name CHAR(50) NOT NULL,
    vend_address CHAR(50) ,
    vend_city CHAR(50) ,
    vend_state CHAR(5) ,
    vend_zip CHAR(10) ,
    vend_country CHAR(50)
);

        主键和NULL 值

        第1课介绍过,主键是其值唯一标识表中每一行的列。只有不允许NULL值的列可作为主键,允许NULL 值的列不能作为唯一标识。


        理解NULL

        不要把NULL 值与空字符串相混淆。NULL 值是没有值,不是空字符串。如果指定''(两个单引号,其间没有字符),这在NOT NULL 列中是允许的。空字符串是一个有效的值,它不是无值。NULL 值用关键字NULL而不是空字符串指定。


        17.1.3 指定默认值

        SQL 允许指定默认值,在插入行时如果不给出值,DBMS 将自动采用默认值。默认值在CREATE TABLE 语句的列定义中用关键字 DEFAULT 指定。

CREATE TABLE OrderItems
(
    order_num INTEGER NOT NULL,
    order_item INTEGER NOT NULL,
    prod_id CHAR(10) NOT NULL,
    quantity INTEGER NOT NULL DEFAULT 1,
    item_price DECIMAL(8,2) NOT NULL
);

        默认值经常用于日期或时间戳列。


        使用DEFAULT 而不是NULL 值

        许多数据库开发人员喜欢使用DEFAULT 值而不是NULL 列,对于用于计算或数据分组的列更是如此。 


17.2 更新表

        更新表定义,可以使用 ALTER TABLE 语句。以下是使用ALTERTABLE 时需要考虑的事情:

  • 理想情况下,不要在表中包含数据时对其进行更新。应该在表的设计过程中充分考虑未来可能的需求,避免今后对表的结构做大改动。
  • 所有的DBMS 都允许给现有的表增加列,不过对所增加列的数据类型(以及NULL 和DEFAULT 的使用)有所限制。
  • 许多DBMS 不允许删除或更改表中的列。
  • 多数DBMS 允许重新命名表中的列。
  • 许多DBMS 限制对已经填有数据的列进行更改,对未填有数据的列几乎没有限制。

        使用ALTER TABLE 更改表结构,必须给出下面的信息:

  • 在ALTER TABLE 之后给出要更改的表名(该表必须存在,否则将出错);
  • 列出要做哪些更改。

        因为给已有表增加列可能是所有DBMS 都支持的唯一操作,所以我们举个这样的例子:

ALTER TABLE Vendors ADD vend_phone CHAR(20);

        这条语句给Vendors 表增加一个名为 vend_phone 的列,其数据类型为 CHAR。

        更改或删除列、增加约束或增加键,这些操作也使用类似的语法(注意,下面的例子并非对所有 DBMS 都有效)。

ALTER TABLE Vendors DROP COLUMN vend_phone;

        复杂的表结构更改一般需要手动删除过程,它涉及以下步骤:

  • 用新的列布局创建一个新表;
  • 使用 INSERT SELECT 语句(关于这条语句的详细介绍,请参阅第15课)从旧表复制数据到新表。有必要的话,可以使用转换函数和计算字段;
  • 检验包含所需数据的新表;
  • 重命名旧表(如果确定,可以删除它);
  • 用旧表原来的名字重命名新表;
  • 根据需要,重新创建触发器、存储过程、索引和外键。

        小心使用ALTER TABLE

        使用ALTER TABLE 要极为小心,应该在进行改动前做完整的备份(表结构和数据的备份)。数据库表的更改不能撤销,如果增加了不需要的列,也许无法删除它们。类似地,如果删除了不应该删除的列,可能会丢失该列中的所有数据。


17.3 删除表

        删除表(删除整个表而不是其内容)非常简单,使用DROP TABLE 语句即可。

DROP TABLE tableName;

       删除表没有确认,也不能撤销,执行这条语句将永久删除该表。

        相关删除表的语句参见博客:Oracle常用SQL语句


        使用关系规则防止意外删除

        许多DBMS 允许强制实施有关规则,防止删除与其他表相关联的表。在实施这些规则时,如果对某个表发布一条DROP TABLE 语句,且该表是某个关系的组成部分,则DBMS 将阻止这条语句执行,直到该关系被删除为止。如果允许,应该启用这些选项,它能防止意外删除有用的表。


17.4 重命名表

        每个DBMS 对表重命名的支持有所不同。对于这个操作,不存在严格的标准。所有重命名操作的基本语法都要求指定旧表名和新表名。


17.5 小结

        CREATE TABLE 用来创建新表,ALTER TABLE 用来更改表列(或其他诸如约束或索引等对象),而 DROP TABLE 用来完整地删除一个表。这些语句必须小心使用,并且应该在备份后使用。

猜你喜欢

转载自blog.csdn.net/qq_57163366/article/details/130200382