查看表结构
sql
DESC n_emp1
查看创建表的语句结构
sql
注意:创建表时,如果没有指定字符集,则默认使用表所在数据库的字符集
SHOW CREATE TABLE n_emp1
方式1
sql
CREATE TABLE IF NOT EXISTS n_emp1(
id INT,
emp_name VARCHAR(15), "使用 varchar 定义字符串时,必须指明其长度"
hire_date DATE
)
方式2:CTAS 建表(复制表 + 数据)
基于现有的表,创建新表的同时,会自动导入数据
行为特性(重点)
- 自动复制 :查询返回的字段名、数据类型、长度;同时把查询结果全部插入新表
- 丢失信息(巨大坑点)
CTAS复制只会复制字段结构+数据,不会复制:主键、外键、索引、自增、字符集注释、非空约束- 原表
employee_id是主键,复制到n_emp2后只是普通 int 字段,失去主键特性; - 原表非空字段,新表全部变为可空;
- 外键、乐观锁version、索引全部消失。
- 原表
CTAS 复制出来的临时表,若后续要当业务表,必须,手动重建主键 和 索引;
sql
CREATE TABLE n_emp2
AS
SELECT employee_id, last_name, salary
FROM employees
DESC n_emp2
DESC employees
SELECT * FROM n_emp2
练习1:复制表,包括表数据
TRUNCATE 谨慎使用,数据不可回滚;业务删数据优先用 DELETE 加 事务。
sql
"创建一个 employees_copy,实现对 employees表的复制,包括表数据"
CREATE TABLE employees_copy
AS
SELECT * FROM employees
SELECT * FROM employees_copy
"清空表(TRUNCATE 谨慎使用,数据不可回滚;业务删数据优先用DELETE加事务)"
TRUNCATE TABLE employees_copy
练习2 - 复制表,不包括表数据
sql
" 创建一个 employees_bank,实现对 employees表的复制,不包括表数据 "
CREATE TABLE employees_bank
AS
SELECT *
FROM employees
" WHERE department_id > 99999 万一有 department_id > 99999 就会把表数据也复制了,所以不保险 "
WHERE 1 = 2 "这样就保险了,绝对只会复制employees表的结构,不会复制employees表的数据"