精华内容
下载资源
问答
  • 细说 MySQL 创建表三种方法

    千次阅读 2021-08-15 21:38:02
    MySQL 则实现了三种创建表方法,支持自定义表结构或者通过复制已的表结构(CREATE TABLE ... LIKE 以及 CREATE TABLE ... SELECT)来创建新表,本文给大家分别介绍一下这些方法的使用和注意事项。

    大家好!我是只谈技术不剪发的 Tony 老师。

    SQL 标准使用 CREATE TABLE 语句创建数据表;MySQL 则实现了三种创建表的方法,支持自定义表结构或者通过复制已有的表结构来创建新表,本文给大家分别介绍一下这些方法的使用和注意事项。

    如果你觉得文章有用,欢迎评论📝、点赞👍、推荐🎁

    CREATE TABLE

    CREATE TABLE 语句的基本语法如下:

    CREATE TABLE [IF NOT EXISTS] table_name
    (
      column1 data_type column_constraint,
      column2 data_type,
      ...,
      table_constraint
    );
    

    使用该语句时,我们需要手动定义表的结构。以上包含的内容如下:

    • IF NOT EXISTS 表示当该表不存在时创建表,当表已经存在时不执行该语句。
    • table_name 指定了表的名称。
    • 括号内是字段的定义;columnN 是字段的名称,data_type 是它的数据类型;column_constraint 是可选的字段约束;多个字段使用逗号进行分隔。
    • table_constraint 是可选的表级约束。

    其中,常见的约束包括主键、外键、唯一、非空、检查约束以及默认值。

    举例来说,以下语句用于创建一个新表 department:

    CREATE TABLE department
        ( dept_id    INTEGER NOT NULL PRIMARY KEY
        , dept_name  VARCHAR(50) NOT NULL
        ) ;
    

    部门表 department 包含两个字段,部门编号(dept_id)是一个整数类型(INTEGER),不可以为空(NOT NULL),同时它还是这个表的主键(PRIMARY KEY)。部门名称(dept_name)是一个可变长度的字符串,最长 50 个字符,不允许为空。

    如果我们想要创建一个自定义名称的主键约束,可以使用表级约束:

    CREATE TABLE department
        ( dept_id    INTEGER NOT NULL
        , dept_name  VARCHAR(50) NOT NULL
        , CONSTRAINT pk_department PRIMARY KEY (dept_id)
        ) ;
    

    表级约束在所有字段之后定义,其中 pk_dept 是自定义的主键名称。

    对于数字类型的主键字段,我们可以通过自增长列(auto increment)自动生成一个唯一的数字。例如:

    CREATE TABLE department
        ( dept_id    INTEGER AUTO_INCREMENT PRIMARY KEY
        , dept_name  VARCHAR(50) NOT NULL
        ) ;
    

    此时,我们在插入数据时不再需要为 dept_id 字段提供数据,MySQL 默认会产生一个从 1 开始,每次递增 1 的数字序列。

    然后我们再创建两个表:

    CREATE TABLE job
        ( job_id         INTEGER NOT NULL PRIMARY KEY
        , job_title      VARCHAR(50) NOT NULL
        ) ;
        
    CREATE TABLE employee
        ( emp_id    INTEGER NOT NULL PRIMARY KEY
        , emp_name  VARCHAR(50) NOT NULL
        , sex       VARCHAR(10) NOT NULL
        , dept_id   INTEGER NOT NULL
        , manager   INTEGER
        , hire_date DATE NOT NULL
        , job_id    INTEGER NOT NULL
        , salary    NUMERIC(8,2) NOT NULL
        , bonus     NUMERIC(8,2)
        , email     VARCHAR(100) NOT NULL
        , CONSTRAINT ck_emp_sex CHECK (sex IN ('男', '女'))
        , CONSTRAINT ck_emp_salary CHECK (salary > 0)
        , CONSTRAINT uk_emp_email UNIQUE (email)
        , CONSTRAINT fk_emp_dept FOREIGN KEY (dept_id) REFERENCES department(dept_id)
        , CONSTRAINT fk_emp_job FOREIGN KEY (job_id) REFERENCES job(job_id)
        , CONSTRAINT fk_emp_manager FOREIGN KEY (manager) REFERENCES employee(emp_id)
        ) ;
    

    job 表用于存储职位信息,和部门表相似,比较简单。

    employee 表用于存储员工信息,包含的字段和约束如下:

    • 员工编号(emp_id)是一个整数类型(INTEGER),不可以为空(NOT NULL),同时它还是这个表的主键(PRIMARY KEY)。
    • 员工姓名(emp_name)是一个可变长度的字符串,最长 50 个字符,不允许为空。
    • 性别(sex)是一个可变长度的字符串,最长 10 个字符,不允许为空;另外,我们通过表级约束 ck_emp_sex 限制了性别的取值只能为“男”或者“女”。
    • 部门编号(dept_id)代表了员工所在的部门,因此通过外键约束 fk_emp_dept 引用了部门表的主键字段。
    • 经理编号(manager)代表了员工的直接上级,可能为空。外键约束 fk_emp_manager 表示经理也属于员工。
    • 入职日期(hire_date)是一个 DATE 类型的字段,不能为空。
    • 职位编号(job_id)代表了员工的职位,因此通过外键 fk_emp_job 引用了职位表的主键字段。
    • 月薪(salary)是一个支持两位小数的数字,不能为空。检查约束 ck_emp_salary 要求月薪必须大于零。
    • 奖金(bonus)是一个可选的数字字段。
    • 电子邮箱(email)是一个可变长度的字符串,最长100 个字符,不允许为空。检查约束 uk_emp_email 要求每个员工的电子邮箱都不相同。

    CREATE TABLE … LIKE

    除了手动定义表的结构之外,MySQL 还提供了复制已有表结构的方法:

    CREATE TABLE [IF NOT EXISTS] table_name
        { LIKE old_tbl_name | (LIKE old_tbl_name) }
    

    MySQL 的 LIKE 语法只复制表结构,包括字段的属性和索引,但是不复制数据。例如:

    CREATE TABLE emp_copy
      LIKE employee;
    

    以上语句基于 employee 表的结构复制生成一个新的表 emp_copy。

    mysql> show create table emp_copy \G
    *************************** 1. row ***************************
           Table: emp_copy
    Create Table: CREATE TABLE `emp_copy` (
      `emp_id` int NOT NULL,
      `emp_name` varchar(50) NOT NULL,
      `sex` varchar(10) NOT NULL,
      `dept_id` int NOT NULL,
      `manager` int DEFAULT NULL,
      `hire_date` date NOT NULL,
      `job_id` int NOT NULL,
      `salary` decimal(8,2) NOT NULL,
      `bonus` decimal(8,2) DEFAULT NULL,
      `email` varchar(100) NOT NULL,
      PRIMARY KEY (`emp_id`),
      UNIQUE KEY `uk_emp_email` (`email`),
      KEY `fk_emp_dept` (`dept_id`),
      KEY `fk_emp_job` (`job_id`),
      KEY `fk_emp_manager` (`manager`),
      CONSTRAINT `emp_copy_chk_1` CHECK ((`salary` > 0)),
      CONSTRAINT `emp_copy_chk_2` CHECK ((`sex` in (_utf8mb4'男',_utf8mb4'女')))
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
    1 row in set (0.01 sec)
    

    对于 CREATE TABLE … LIKE 命令,目标表会保留原始表中的主键、唯一约束、非空约束、表达式默认值、检查约束(自动生成约束名),同时还会保留原始表中的计算列定义。

    CREATE TABLE … LIKE 命令不会保留外键约束(但是会保留外键索引),以及任何 DATA DIRECTORY 或者 INDEX DIRECTORY 表属性选项。

    如果原始表是一个 TEMPORARY 表,CREATE TABLE … LIKE 不会保留 TEMPORARY 关键字。如果想要创建一个临时表,可以使用 CREATE TEMPORARY TABLE … LIKE。

    使用 mysql 表空间、InnoDB 系统表空间(innodb_system)或者通用表空间创建的表包含一个 TABLESPACE 属性,表示该表所在的表空间。目前,无论 innodb_file_per_table 设置为什么参数,CREATE TABLE … LIKE 都会保留 TABLESPACE 属性。为了避免复制新表时使用原始表的 TABLESPACE 属性,可以使用下面介绍的第三种方法。例如:

    CREATE TABLE new_tbl SELECT * FROM orig_tbl LIMIT 0;
    

    以上语句会基于 orig_tbl 创建一个新的空表 new_tbl,具体参考下一节内容。

    CREATE TABLE … LIKE 使用原始表的所有 ENGINE_ATTRIBUTE 和 SECONDARY_ENGINE_ATTRIBUTE 值创建目标表。

    另外,LIKE 只能基于表进行复制,而不能复制视图。

    CREATE TABLE … SELECT

    在 MySQL 中复制表结构的另一种方法就是利用查询语句的结果定义字段和复制的数据:

    CREATE TABLE table_name
      [AS] SELECT ...;
    

    其中的 SELECT 语句定义了新表的结构和数据。以下示例基于查询的结果创建了一个新表:emp_devp,表中包含了研发部的所有员工。

    CREATE TABLE emp_devp
        AS
    SELECT e.*
      FROM employee e
      JOIN department d
        ON (d.dept_id = e.dept_id AND d.dept_name = '研发部');
    

    对于这种语法,MySQL 实际上是在已有目标表中增加新的字段。例如:

    CREATE TABLE t1(col1 INTEGER, col2 INTEGER);
    INSERT INTO t1(col1, col2) VALUES(1, 1), (2, 4);
    
    CREATE TABLE t2(id INTEGER AUTO_INCREMENT PRIMARY KEY)
           ENGINE=InnoDB
        AS SELECT col1, col2 FROM t1;
    

    我们首先为 t2 指定了一个自增 id,然后将 t1 的查询结果添加到该字段的后面。其中,ENGINE 选项属于 CREATE TABLE 语句,因此需要位于 SELECT 语句之前。

    查询 t2 可以看到以上语句不仅复制了表结构,同时还复制了 t1 中的数据:

    TABLE t2;
    
    +----+------+------+
    | id | col1 | col2 |
    +----+------+------+
    |  1 |    1 |    1 |
    |  2 |    2 |    4 |
    +----+------+------+
    2 rows in set (0.00 sec)
    

    如果只想复制结构,不需要复制数据,可以在查询语句中增加 LIMIT 0 或者 WHERE 1=0 条件。

    如果在 SELECT 语句前面增加 IGNORE 或者 REPLACE 关键字,可以处理复制数据时导致唯一键冲突的数据行。对于 IGNORE,源数据中和目标表重复的数据行就会被丢弃;对于 REPLACE,使用新数据行替换目标表中的已有数据行。如果没有指定任何选项,唯一键冲突将会返回错误。

    CREATE TABLE … SELECT 命令不会自动创建任何索引,这样可以使得该语句尽量灵活。如果想要创建索引,可以在 SELECT 语句之前指定。例如:

    CREATE TABLE t3(id INTEGER PRIMARY KEY)
    AS SELECT col1 as id, col2 FROM t1;
    

    CREATE TABLE … SELECT 命令不会保留计算列的定义,也不会保留默认值定义。同时某些数据类型可能产生转换。例如,AUTO_INCREMENT 属性不会被保留,VARCHAR 类型被转换为 CHAR 类型。保留的属性包括 NULL(NOT NULL)以及 CHARACTER SET、COLLATION、COMMENT 和 DEFAULT 子句。

    使用 CREATE TABLE … SELECT 命令创建表时,需要为查询语句中的函数和表达式指定一个别名,否则该命令可能失败或者创建意料之外的字段名:

    CREATE TABLE artists_and_works
    SELECT artist.name, COUNT(work.artist_id) AS number_of_works
    FROM artist LEFT JOIN work ON artist.id = work.artist_id
    GROUP BY artist.id;
    

    对于 CREATE TABLE … SELECT 命令,如果我们指定了 IF NOT EXISTS 并且目标表已经存在,不会将数据复制到目标表,同时该语句不会写入日志文件。

    CREATE TABLE … SELECT 命令不支持 FOR UPDATE 选项。

    CREATE TABLE … SELECT 命令只会应用字段的 ENGINE_ATTRIBUTE 和 SECONDARY_ENGINE_ATTRIBUTE 属性。表和索引的 ENGINE_ATTRIBUTE 和 SECONDARY_ENGINE_ATTRIBUTE 属性不会被应用,除非为目标表明确指定这些选项。

    总结

    本文通过一些案例介绍了 MySQL 中三种创建表的方法和注意事项。

    如果你想要了解更多 MySQL 入门知识,可以参考这篇文章

    展开全文
  • 文章目录MySQL创建数据三种方法,以及种插入数据的方式MYSQL创建数据三种方法:1.常规创建2.复制表格3.将table1的部分拿来创建table2mysql中常用的种插入数据的语句:1. insert into2. replace into3. ...

    MySQL创建数据表的三种方法,以及三种插入数据的方式

    MYSQL创建数据表的三种方法:

    1.常规创建

    创建一个actor

    # create table if not exists 目标表
    create table if not exists actor(	--表名若存在则不创建
    	actor_id smallint(5) primary key,
    	first_name varchar(45) not null,
    	last_name varchar(45) not null,
    	last_update date not null);
    

    第二种:如果重名则覆盖原来的表

    drop table if exists actor;	--表名若存在则删除
    create table actor(	
    	actor_id smallint(5) primary key,
    	first_name varchar(45) not null,
    	last_name varchar(45) not null,
    	last_update date not null);
    

    2.复制表格

    创建一个actor_copy表,复制actor表所有数据

    create 目标表 like 来源表
    create actor_copy like actor	--新表数据与原表一致
    

    3.将table1的部分拿来创建table2

    创建一个actor_name表,并且将actor表中的所有first_name以及last_name导入该表.

    create table if not exists actor_name(
    	first_name varchar(45) not null,
    	last_name varchar(45) not null
    )			-- 这里不能加分号,因为是一条sql语句
    select first_name,last_name
    from actor			-- 自动导入
    

    或者:

    create table if not exists actor_name(
    	first_name varchar(45) not null,
    	last_name varchar(45) not null
    );
    insert into actor_name
    select first_name,last_name
    from actor			-- 自动导入
    

    mysql中常用的三种插入数据的语句:

    插入数据重复:当插入字段为主键Primary Key,或者unique索引修饰时,则插入数据重复。

    1. insert into

    直接插入,插入数据重复则报错

    # insert into表示插入数据,数据库会检查主键,如果出现重复会报错;
    insert into actor values("3","ED","CHASE","2006-02-15 12:34:33");
    

    2. replace into

    替换插入,主键或者unique字段重复时,替换原来数据

    # replace into表示插入替换数据,需求表中有PrimaryKey,或者unique索引,
    #		如果数据库已经存在数据,则用新数据替换,如果没有数据效果则和insert into一样;
    replace into actor values("3","ED","CHASE","2006-02-15 12:34:33");
    

    3. insert ignore

    忽略插入,主键或者unique字段重复时,则忽略当前插入的数据

    # insert ignore表示,如果中已经存在相同的记录,则忽略当前新数据;
    insert ignore into actor values("3","ED","CHASE","2006-02-15 12:34:33");
    
    展开全文
  • 版权声明:本文为博主原创文章,欢迎转载,转载请注明出处! ... 注:hive其他语法在hive官网说明,建议初学者,去官网学习一手的资料, 官网:htt...
    版权声明:本文为博主原创文章,欢迎转载,转载请注明出处! https://blog.csdn.net/qq_36743482/article/details/78383964

    注:hive其他语法在hive官网有说明,建议初学者,去官网学习一手的资料,
    官网:https://cwiki.apache.org/confluence/display/Hive/Home#Home-UserDocumentation

    Create Table

    官网说明

    Hive建表方式共有三种:

    • 直接建表法
    • 查询建表法
    • like建表法

    首先看官网介绍
    ’[]’ 表示可选,’|’ 表示二选一

    CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name    -- (Note: TEMPORARY available in Hive 0.14.0 and later)
      [(col_name data_type [COMMENT col_comment], ... [constraint_specification])]
      [COMMENT table_comment]
      [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
      [CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
      [SKEWED BY (col_name, col_name, ...)                  -- (Note: Available in Hive 0.10.0 and later)]
         ON ((col_value, col_value, ...), (col_value, col_value, ...), ...)
         [STORED AS DIRECTORIES]
      [
       [ROW FORMAT row_format] 
       [STORED AS file_format]
         | STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)]  -- (Note: Available in Hive 0.6.0 and later)
      ]
      [LOCATION hdfs_path]
      [TBLPROPERTIES (property_name=property_value, ...)]   -- (Note: Available in Hive 0.6.0 and later)
    

    [AS select_statement]; – (Note: Available in Hive 0.5.0 and later; not supported for external tables)

    CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
    LIKE existing_table_or_view_name
    [LOCATION hdfs_path];

    data_type
    primitive_type
    | array_type
    | map_type
    | struct_type
    | union_type – (Note: Available in Hive 0.7.0 and later)
    primitive_type
    TINYINT
    | SMALLINT
    | INT
    | BIGINT
    | BOOLEAN
    | FLOAT
    | DOUBLE
    | DOUBLE PRECISION – (Note: Available in Hive 2.2.0 and later)
    | STRING
    | BINARY – (Note: Available in Hive 0.8.0 and later)
    | TIMESTAMP – (Note: Available in Hive 0.8.0 and later)
    | DECIMAL – (Note: Available in Hive 0.11.0 and later)
    | DECIMAL(precision, scale) – (Note: Available in Hive 0.13.0 and later)
    | DATE – (Note: Available in Hive 0.12.0 and later)
    | VARCHAR – (Note: Available in Hive 0.12.0 and later)
    | CHAR – (Note: Available in Hive 0.13.0 and later)
    array_type
    ARRAY < data_type >
    map_type
    MAP < primitive_type, data_type >
    struct_type
    STRUCT < col_name : data_type [COMMENT col_comment], …>
    union_type
    UNIONTYPE < data_type, data_type, … > – (Note: Available in Hive 0.7.0 and later)
    row_format
    DELIMITED [FIELDS TERMINATED BY char [ESCAPED BY char]] [COLLECTION ITEMS TERMINATED BY char]
    [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]
    [NULL DEFINED AS char] – (Note: Available in Hive 0.13 and later)
    | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, …)]
    file_format:
    SEQUENCEFILE
    | TEXTFILE – (Default, depending on hive.default.fileformat configuration)
    | RCFILE – (Note: Available in Hive 0.6.0 and later)
    | ORC – (Note: Available in Hive 0.11.0 and later)
    | PARQUET – (Note: Available in Hive 0.13.0 and later)
    | AVRO – (Note: Available in Hive 0.14.0 and later)
    | INPUTFORMAT input_format_classname OUTPUTFORMAT output_format_classname
    constraint_specification:
    [, PRIMARY KEY (col_name, …) DISABLE NOVALIDATE ]
    [, CONSTRAINT constraint_name FOREIGN KEY (col_name, …) REFERENCES table_name(col_name, …) DISABLE NOVALIDATE
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81

    观察可发现一共有三种建表方式,接下来我们将一一讲解。

    1.直接建表法:

    create table table_name(col_name data_type);
    
     
    • 1

    这里我们针对里面的一些不同于关系型数据库的地方进行说明。

    row format

    row_format
      : DELIMITED [FIELDS TERMINATED BY char [ESCAPED BY char]] [COLLECTION ITEMS TERMINATED BY char]
            [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]
            [NULL DEFINED AS char]   -- (Note: Available in Hive 0.13 and later)
      | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]
    

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    Hive将HDFS上的文件映射成表结构,通过分隔符来区分列(比如’,’ ‘;’ or ‘^’ 等),row format就是用于指定序列化和反序列化的规则。
    比如对于以下记录:

    1,xiaoming,book-TV-code,beijing:chaoyang-shagnhai:pudong
    2,lilei,book-code,nanjing:jiangning-taiwan:taibei
    3,lihua,music-book,heilongjiang:haerbin
    
     
    • 1
    • 2
    • 3

    逗号用于分割列,即FIELDS TERMINATED BY char,分割为如下列 IDnamehobby(该字段是数组形式,通过 ‘-’ 进行分割,即COLLECTION ITEMS TERMINATED BY ‘-’)、address(该字段是键值对形式map,通过 ‘:’ 分割键值,即 MAP KEYS TERMINATED BY ‘:’);
    而FIELDS TERMINATED BY char用于区分不同条的数据,默认是换行符;

    file format(HDFS文件存放的格式)

    默认TEXTFILE,即文本格式,可以直接打开。

    如下:根据上述文件内容,创建一个表t1

    create table t1(
        id      int
       ,name    string
       ,hobby   array<string>
       ,add     map<String,string>
    )
    row format delimited
    fields terminated by ','
    collection items terminated by '-'
    map keys terminated by ':'
    ;
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    这里写图片描述
    2. 查看表的描述:desc t1;
    这里写图片描述

    1. 下面插入数据
      注:一般很少用insert (不是insert overwrite)语句,因为就算就算插入一条数据,也会调用MapReduce,这里我们选择Load Data的方式。
    LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]
    
     
    • 1

    创建一个文件粘贴上述记录,并上载即可,如下图:
    这里写图片描述
    然后上载

    load data local inpath '/home/hadoop/Desktop/data' overwrite into table t1;
    
     
    • 1

    别忘记写文件名/data,笔者第一次忘记写,把整个Desktop上传了,一查全是null和乱码。。。。
    查看表内容:

    select * from t1;
    
     
    • 1

    这里写图片描述

    external

    未被external修饰的是内部表(managed table),被external修饰的为外部表(external table);
    区别:
    内部表数据由Hive自身管理,外部表数据由HDFS管理;
    内部表数据存储的位置是hive.metastore.warehouse.dir(默认:/user/hive/warehouse),外部表数据的存储位置由自己制定;
    删除内部表会直接删除元数据(metadata)及存储数据;删除外部表仅仅会删除元数据,HDFS上的文件并不会被删除;
    对内部表的修改会将修改直接同步给元数据,而对外部表的表结构和分区进行修改,则需要修复(MSCK REPAIR TABLE table_name;)

    创建一个外部表t2

    create external table t2(
        id      int
       ,name    string
       ,hobby   array<string>
       ,add     map<String,string>
    )
    row format delimited
    fields terminated by ','
    collection items terminated by '-'
    map keys terminated by ':'
    location '/user/t2'
    ;
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    这里写图片描述

    装载数据
    load data local inpath '/home/hadoop/Desktop/data' overwrite into table t2;
    
     
    • 1

    这里写图片描述

    查看文件位置

    如下图,我们在NameNode:50070/explorer.html#/user/目录下,可以看到t2文件
    这里写图片描述

    t1在哪呢?在我们之前配置的默认路径里
    这里写图片描述

    同样我们可以通过命令行获得两者的位置信息:

    desc formatted table_name;
    
     
    • 1

    这里写图片描述

    这里写图片描述
    注:图中managed table就是内部表,而external table就是外部表。

    分别删除内部表和外部表

    下面分别删除内部表和外部表,查看区别
    这里写图片描述

    观察HDFS上的文件

    发现t1已经不存在了
    这里写图片描述

    但是t2仍然存在
    这里写图片描述
    因而外部表仅仅删除元数据

    重新创建外部表t2
    create external table t2(
        id      int
       ,name    string
       ,hobby   array<string>
       ,add     map<String,string>
    )
    row format delimited
    fields terminated by ','
    collection items terminated by '-'
    map keys terminated by ':'
    location '/user/t2'
    ;
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    这里写图片描述

    不往里面插入数据,我们select * 看看结果
    这里写图片描述
    可见数据仍然在!!!

    官网说明
    A table created without the EXTERNAL clause is called a managed table because Hive manages its data. 
    Managed and External Tables
    By default Hive creates managed tables, where files, metadata and statistics are managed by internal Hive processes. A managed table is stored under the hive.metastore.warehouse.dir path property, by default in a folder path similar to /apps/hive/warehouse/databasename.db/tablename/. The default location can be overridden by the location property during table creation. If a managed table or partition is dropped, the data and metadata associated with that table or partition are deleted. If the PURGE option is not specified, the data is moved to a trash folder for a defined duration.
    Use managed tables when Hive should manage the lifecycle of the table, or when generating temporary tables.
    An external table describes the metadata / schema on external files. External table files can be accessed and managed by processes outside of Hive. External tables can access data stored in sources such as Azure Storage Volumes (ASV) or remote HDFS locations. If the structure or partitioning of an external table is changed, an MSCK REPAIR TABLE table_name statement can be used to refresh metadata information.
    Use external tables when files are already present or in remote locations, and the files should remain even if the table is dropped.
    Managed or external tables can be identified using the DESCRIBE FORMATTED table_name command, which will display either MANAGED_TABLE or EXTERNAL_TABLE depending on table type.
    Statistics can be managed on internal and external tables and partitions for query optimization. 
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2.查询建表法

    通过AS 查询语句完成建表:将子查询的结果存在新表里,有数据
    一般用于中间表

    CREATE TABLE new_key_value_store
       ROW FORMAT SERDE "org.apache.hadoop.hive.serde2.columnar.ColumnarSerDe"
       STORED AS RCFile
       AS
    SELECT (key % 1024) new_key, concat(key, value) key_value_pair
    FROM key_value_store
    SORT BY new_key, key_value_pair;
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    根据例子我们建一张表:t3

    create table t3 as
    select
        id
       ,name
    from t2
    ;
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    会执行MapReduce过程。
    查看表结构及内容,发现是有数据的,并且由于没有指定外部表和location,该表在默认位置,即是内部表。
    这里写图片描述

    3.like建表法

    会创建结构完全相同的表,但是没有数据。
    常用语中间表

    CREATE TABLE empty_key_value_store
    LIKE key_value_store;
    
     
    • 1
    • 2

    例子

    create table t4 like t2;
    
     
    • 1

    可以发现,不会执行MapReduce,且表结构和t2完全一样,但是没有数据。
    这里写图片描述

            </div>
    					<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-2787195726.css" rel="stylesheet">
                </div>
    
    展开全文
  • 链表创建三种方法

    万次阅读 2011-08-03 13:22:53
    作为最常用的数据结构之一,链表被广泛应用在各个方面,下至操作系统底层的驱动程序上至各种应用软件, 都处处可以看到链表的身影,皆因其操作的简便与应用的...以下几种方法: 方法一: struct link_node {
    作为最常用的数据结构之一,链表被广泛应用在各个方面,下至操作系统底层的驱动程序上至各种应用软件,
    
    都处处可以看到链表的身影,皆因其操作的简便与应用的高效性。总结个人目前所学,链表的创建方式主要有

    以下几种方法:


    方法一:

    struct link_node {
       struct link_node *next;
       int value;
    };
    
    
    
      struct link_node *list = NULL;
      struct link_node *tail = NULL;
      struct link_node *node;
      
      for ( i = 0; i < n; i++ ) {
          node = (struct link_node *)malloc(sizeof(struct link_node));
          node->next = NULL;
          node->value = ??;
          if ( tail != NULL ) {
             tail->next = node;
             tail = node;
          }
          else {
              list = tail = node;
          }
      }

    这个方法应该是最常见的方法,简单明了,但其缺憾是每次插入时都要进行比较,并且每次都要改变tail的值。

    方法二:

    struct link_node *list = NULL;
    struct link_node **tail = &list;
    struct link_node *node;
    
    for ( i = 1; i <= 5; i++ ) {
         node = (struct node *)malloc(sizeof(struct node));
         node->next = NULL;
         node->value = ??;
    
         *tail = node;
         tail = &(node->next);
    }

    这个方法需要稍微推敲一下,tail在这里起到了一个中转的作用,实现了高效的数据插入。

    方法三:
    struct link_node *list = (struct node *)malloc(sizeof(struct node));
    list->next = NULL;
    list->value = (int)list;
    
    struct link_node *node;
    
    for ( i = 1; i <= n; i++ ) {
        node = (struct node *)malloc(sizeof(struct node));
        node->next = NULL;
        node->value = ??;
    
        (struct link_node *)(list->value)->next = node;
        list->value = (int)node;
    }
    

    这个方法有点取巧,但不失其学习性,最后list的value为最后一个结点的地址,而next则指向第一个具有意义的
    value的结点。


    展开全文
  • Postgresql 以下三种方法设置主键递增的方式,下面来看下相同点和不同点。 方法1: 1. create table test_a ( id serial, name character varying(128), constraint pk_test_a_id primary key( id) ); NOTICE:...
  • MSSQL创建临时的两种方法

    千次阅读 2013-07-13 13:54:33
    下面是创建临时表的两种方法: 第一种方法(全新创建)—— ...create table意为创建表; #t,意为表名是t,加#号,表示此表为临时表而非实体表; 括号中为字段定义,即字段名,类型,长度,各字段用英文逗号
  • #include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; #define N 10 //定义结构体单元 typedef struct node{ ...//正向创建单向链表(方法一,先创建头结点) /* ElemSN* CreatLink(i...
  • hive中创建表三种方式

    千次阅读 2019-07-09 21:00:16
    (1)创建外部:删除后数据删除,元数据还在 create EXTERNAL table 名称(字段信息) ROW FORMAT DELIMITED FIELDS TERMINATED BY '字段之间分割符' LINES TERMINATED BY '\n' (2)创建管理:删除后数据...
  • oracle 创建临时几种方法

    千次阅读 2013-09-01 14:05:49
    会话临时 和事物临时:  Create Global Temporary Table Table_Name  (Col1 Type1,Col2 Type2...) On Commit Preserve Rows ;    Create Global Temporary Table Table_Name  (Col1 Type1,Col2
  • 创建CSS 样式表有三种方式

    千次阅读 2016-11-24 20:02:47
    创建CSS 样式表有三种方式:1.元素内嵌样式;2.文档内嵌样式;3.外部引入样式。 (1) 元素内嵌样式这是一段文本 解释:即在当前元素使用style 属性的声明方式。 (2) 文档内嵌样式: 在元素之间创建元素,通过选择...
  • hive 中创建表三种方式

    万次阅读 2018-12-23 09:17:06
    官网地址:...通常我们所使用的创建hive表有三种方式 1.create table 首先我们找到官网对创建表的描述如下: ’[]’ 表示可选,’|’ 表示选一 CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] ...
  • 不管是哪种方法,都能完成你需要的操作,只不过方式不同。根据自己的需要选择一种就行了。 第一种:自带的ManyToManyField django会帮你在数据库自动生成一个老师和班级的关系,但不显示在models.py里面,所以不能...
  • 小伙伴们好啊,今天和大家说说用M和DAX创建表几种方式。 我们需要创建的表格如下: 使用DAX创建表 首先来看一种最常用的方式: 方法一:使用DATATABLE创建,实现的代码如下: Employees_1 = DATATABLE ( "Name",...
  • hive创建表定义的3方式

    千次阅读 2018-06-20 19:37:16
    hive创建表定义的3方式(1)、方式一 通过 create......as........selectCREATE TABLE default.weblog_comm AS select ip, time, req_url from default.weblog; (2)、方式二 通过like 进行hive复制表结构CREATE ...
  • MySQL创建数据三种方式

    千次阅读 2020-01-09 19:09:30
    目录 1. 常规 create table 方式 ...3. 根据查询 table1 的结果集来创建表 table2 方式 1. 常规 create table 方式 CREATE TABLE [if not exists] table_name ( column_name1 data_type(size), column_name...
  • SparkSQL创建表几种方式

    万次阅读 2018-11-25 20:42:46
    // 创建一个SparkSession val spark = SparkSession.builder().master("local").appName("sql").getOrCreate() import spark.sqlContext.implicits._ // 导入emp.csv文件(导入数据) val lines = spark....
  • 数据三种创建方式

    千次阅读 2020-04-27 09:28:20
    手动创建表 2.Model First 通过绘制模型图生成数据表 3.Code First 只需要关注代码的编写,数据库中的表由代码中定义的模型自动创建。 并且可以在MVC 的M层中可以定义一系列的模型操作方法(业务逻辑) from ...
  • oracle两临时创建及使用方法

    万次阅读 2017-08-23 15:50:19
    oracle数据库的临时可以用来保存一个会话session的数据,或者一个事务...创建临时表有方式:  1、会话级临时 on commit delete rows; 当COMMIT的时候删除数据(默认情况)  2、事务级临时 on commit p
  • Hive(6):创建表的四方式

    千次阅读 2018-11-06 08:12:45
    在特定需求下,使用不同的创建表方式,创建需要的表。 二、创建方法 1、普通创建 create table student2( num int, name string ) row format delimited fields terminated by'\t'; 2.子查询方式(抽取源表的...
  • Spark创建DataFrame的三种方法

    万次阅读 2018-03-29 20:27:22
    转自:https://vimsky.com/article/2708.html跟关系数据库的(Table)一样,...创建DataFrame很多种方法,比如从本地List创建、从RDD创建或者从源数据创建,下面简要介绍创建DataFrame的三种方法。方法一,Spark...
  • 创建表的时候直接指定: CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, INDEX [indexName] (username(length)) ); 删除索引的语法: DROP INDEX [indexName] ON mytable; 2、唯一索引 它...
  • 基于pyspark创建DataFrame的几种方法

    千次阅读 2020-03-17 12:59:49
    基于pyspark创建DataFrame的几种方法pyspark创建DataFrameRDD和DataFrame使用二元组创建DataFrame使用键值对创建DataFrame使用rdd创建DataFrame基于rdd和ROW创建DataFrame基于rdd和StructType创建DataFrame基于...
  • Power BI创建日期几种方式概览

    千次阅读 2020-09-02 15:00:03
    https://mp.weixin.qq.com/s/A46jjVXwN4NMUkjDoVnqfQ
  • 前言:MySQL创建用户的方法分成三种:INSERT USER方法、CREATE USER的方法、GRANT的方法
  • MGraph CreateGraph_matric(int nvNum); void InsertEdge_matric(MGraph Graph,Edge E); MGraph biuldGraph_matric()

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,068,835
精华内容 427,534
关键字:

创建表有哪三种方法