zoukankan      html  css  js  c++  java
  • 读书笔记--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语句。
    所有重命名操作的基本语法都要求指定旧表名和新表名。

  • 相关阅读:
    yii中sphinx索引配置解析
    Java HashMap工作原理及实现?
    Spring AOP 实现原理与 CGLIB 应用
    Spring 容器AOP的实现原理——动态代理
    代理模式(静态代理)
    Java中的字符串常量池
    JAVA对象的深度克隆
    重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?
    访问修饰符public,private,protected和default的区别?
    Java中的字符串常量池?
  • 原文地址:https://www.cnblogs.com/anliven/p/6235358.html
Copyright © 2011-2022 走看看