读书笔记--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语句。
所有重命名操作的基本语法都要求指定旧表名和新表名。
行动是绝望的解药!
欢迎转载和引用,但请在明显处保留原文链接和原作者信息!
本博客内容多为个人工作与学习的记录,少数内容来自于网络并略有修改,已尽力标明原文链接和转载说明。如有冒犯,即刻删除!
以所舍,求所得,有所获,方所成。