读书笔记--SQL必知必会17--创建和操纵表

17.1 创建表

使用CREATE TABLE语句创建表。
不同的DBMS中CREATE TABLE语句的语法可能不同。

17.1.1 表创建基础

利用CREATE TABLE创建表,必须具备如下信息:

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

实际的表定义(所有列)括在圆括号之中,各列之间用逗号分隔。
在创建新的表时,指定的表名必须不存在,否则会出错。

MariaDB [sqlbzbh]> SHOW TABLES;
+-------------------+
| Tables_in_sqlbzbh |
+-------------------+
| CustCopy          |
| CustNew           |
| Customers         |
| OrderItems        |
| Orders            |
| Products          |
| Vendors           |
+-------------------+
7 rows in set (0.00 sec)

MariaDB [sqlbzbh]> 
MariaDB [sqlbzbh]> CREATE TABLE ProductsNew
    -> (
    ->   prod_id    char(10)      NOT NULL ,
    ->   vend_id    char(10)      NOT NULL ,
    ->   prod_name  char(255)     NOT NULL ,
    ->   prod_price decimal(8,2)  NOT NULL ,
    ->   prod_desc  text          NULL 
    -> );
Query OK, 0 rows affected (0.00 sec)

MariaDB [sqlbzbh]> 
MariaDB [sqlbzbh]> SHOW TABLES;
+-------------------+
| Tables_in_sqlbzbh |
+-------------------+
| CustCopy          |
| CustNew           |
| Customers         |
| OrderItems        |
| Orders            |
| Products          |
| ProductsNew       |
| Vendors           |
+-------------------+
8 rows in set (0.00 sec)

MariaDB [sqlbzbh]> 

17.1.2 使用NULL值

NULL值含义是没有值或缺值,不是空字符串。
每个表列要么是NULL列,要么是NOT NULL列,这种状态在创建时由表的定义规定。
大多数DBMS中,如果不指定NOT NULL时,将默认为NULL。

主键是其值唯一标识表中每一行的列。只有不允许NULL值的列可作为主键。

MariaDB [sqlbzbh]> CREATE TABLE VendorsNew
    -> (
    ->   vend_id      char(10) NOT NULL ,
    ->   vend_name    char(50) NOT NULL ,
    ->   vend_address char(50) NULL ,
    ->   vend_city    char(50) NULL ,
    ->   vend_state   char(5)  NULL ,
    ->   vend_zip     char(10) NULL ,
    ->   vend_country char(50) NULL 
    -> );
Query OK, 0 rows affected (0.00 sec)

MariaDB [sqlbzbh]> 

17.1.3 指定默认值

在CREATE TABLE语句的列定义中用关键字DEFAULT指定默认值。
建议使用DEFAULT值而不是NULL值。
默认值经常用于日期或时间戳列。

MariaDB [sqlbzbh]> CREATE TABLE OrderItemsNew
    -> (
    ->   order_num  int          NOT NULL ,
    ->   order_item int          NOT NULL ,
    ->   prod_id    char(10)     NOT NULL ,
    ->   quantity   int          NOT NULL  DEFAULT '1',
    ->   item_price decimal(8,2) NOT NULL 
    -> );
Query OK, 0 rows affected (0.00 sec)

MariaDB [sqlbzbh]>
MariaDB [sqlbzbh]> SELECT CURRENT_DATE();
+----------------+
| CURRENT_DATE() |
+----------------+
| 2016-12-29     |
+----------------+
1 row in set (0.00 sec)

MariaDB [sqlbzbh]> 

17.2 更新表

使用ALTER TABLE语句更新表定义。

  • 理想情况下,不要在表中包含数据时对其进行更新。
  • 不同DBMS对允许更新的内容差别巨大,需要慎重地区别对待。

使用ALTER TABLE更改表结构,必须具备下面信息:

  • 要更改的表名(必须已经存在)
  • 要更改的列

添加、更改或删除列、增加约束或增加键,这些操作都使用类似的语法。
复杂的表结构更改,一般需要手动建新表、复制数据、检验、重命名或删除旧表等过程,而且可能需要重建触发器、存储过程、索引和外键。

使用ALTER TABLE必须极为小心,应该提前做好完整的备份(表结构和数据的备份)。

MariaDB [sqlbzbh]> SELECT * FROM Vendors;
+---------+-----------------+-----------------+------------+------------+----------+--------------+
| vend_id | vend_name       | vend_address    | vend_city  | vend_state | vend_zip | vend_country |
+---------+-----------------+-----------------+------------+------------+----------+--------------+
| BRE02   | Bear Emporium   | 500 Park Street | Anytown    | OH         | 44333    | USA          |
| BRS01   | Bears R Us      | 123 Main Street | Bear Town  | MI         | 44444    | USA          |
| DLL01   | Doll House Inc. | 555 High Street | Dollsville | CA         | 99999    | USA          |
| FNG01   | Fun and Games   | 42 Galaxy Road  | London     | NULL       | N16 6PS  | England      |
| FRB01   | Furball Inc.    | 1000 5th Avenue | New York   | NY         | 11111    | USA          |
| JTS01   | Jouets et ours  | 1 Rue Amusement | Paris      | NULL       | 45678    | France       |
+---------+-----------------+-----------------+------------+------------+----------+--------------+
6 rows in set (0.00 sec)

MariaDB [sqlbzbh]> 
MariaDB [sqlbzbh]> ALTER TABLE Vendors ADD vend_phone CHAR(20);
Query OK, 6 rows affected (0.01 sec)               
Records: 6  Duplicates: 0  Warnings: 0

MariaDB [sqlbzbh]> 
MariaDB [sqlbzbh]> SELECT * FROM Vendors;
+---------+-----------------+-----------------+------------+------------+----------+--------------+------------+
| vend_id | vend_name       | vend_address    | vend_city  | vend_state | vend_zip | vend_country | vend_phone |
+---------+-----------------+-----------------+------------+------------+----------+--------------+------------+
| BRE02   | Bear Emporium   | 500 Park Street | Anytown    | OH         | 44333    | USA          | NULL       |
| BRS01   | Bears R Us      | 123 Main Street | Bear Town  | MI         | 44444    | USA          | NULL       |
| DLL01   | Doll House Inc. | 555 High Street | Dollsville | CA         | 99999    | USA          | NULL       |
| FNG01   | Fun and Games   | 42 Galaxy Road  | London     | NULL       | N16 6PS  | England      | NULL       |
| FRB01   | Furball Inc.    | 1000 5th Avenue | New York   | NY         | 11111    | USA          | NULL       |
| JTS01   | Jouets et ours  | 1 Rue Amusement | Paris      | NULL       | 45678    | France       | NULL       |
+---------+-----------------+-----------------+------------+------------+----------+--------------+------------+
6 rows in set (0.00 sec)

MariaDB [sqlbzbh]> 

17.3 删除表

使用DROP TABLE语句删除表。
许多DBMS允许强制实施有关规则,防止删除与其他表相关联的表。

MariaDB [sqlbzbh]> SHOW TABLES;
+-------------------+
| Tables_in_sqlbzbh |
+-------------------+
| CustCopy          |
| Customers         |
| OrderItems        |
| Orders            |
| Products          |
| Vendors           |
+-------------------+
6 rows in set (0.00 sec)

MariaDB [sqlbzbh]> 
MariaDB [sqlbzbh]> 
MariaDB [sqlbzbh]> DROP TABLE CustCopy;
Query OK, 0 rows affected (0.00 sec)

MariaDB [sqlbzbh]> 
MariaDB [sqlbzbh]> SHOW TABLES;
+-------------------+
| Tables_in_sqlbzbh |
+-------------------+
| Customers         |
| OrderItems        |
| Orders            |
| Products          |
| Vendors           |
+-------------------+
5 rows in set (0.00 sec)

MariaDB [sqlbzbh]> 

17.4 重命名表

不同的DBMS对重命名操作的有不同的定义和实现。
MySQL和MariaDB使用RENAME语句。
所有重命名操作的基本语法都要求指定旧表名和新表名。

posted @ 2016-12-29 23:55  Anliven  阅读(369)  评论(0编辑  收藏  举报