常用数据类型
- VARCHAR2(n):变长字符串,最常用;必须指定长度
- CHAR(n):定长,不足补空格,只适合长度固定的编码(如性别、国家码)
- NUMBER(p,s):p 是总位数,s 是小数位;NUMBER(10,2) 适合金额
- DATE:日期 + 时间,精确到秒
- TIMESTAMP:可到小数秒并带时区(TIMESTAMP WITH TIME ZONE)
- CLOB / BLOB:大文本 / 二进制。容量上限不是 4GB,而是 (4GB−1) × 块大小,随表空间块大小在 8TB 到 128TB 之间
- RAW(n):二进制,常用于存哈希值或 UUID
- BOOLEAN:23ai 起原生支持
建表与 CTAS
- CTAS 不复制主键/唯一/外键/检查约束、索引、默认值和分区;但会复制显式创建且为 NOT DEFERRABLE + VALIDATE 的 NOT NULL 约束,隐式 NOT NULL(主键带出的)不复制
- VARCHAR2 的长度语义由初始化参数 NLS_LENGTH_SEMANTICS 决定(缺省 BYTE,一个中文常占 3 字节);要确保按字符计数,显式写 VARCHAR2(200 CHAR)
- CTAS 是 DDL,会隐式提交
CREATE TABLE employees_demo (
employee_id NUMBER(6) NOT NULL,
last_name VARCHAR2(25) NOT NULL,
email VARCHAR2(25),
hire_date DATE DEFAULT SYSDATE,
salary NUMBER(8,2),
remarks VARCHAR2(200 CHAR), -- CHAR 语义:按字符计数,中文更友好
CONSTRAINT pk_emp_demo PRIMARY KEY (employee_id)
);
-- CTAS:只复制结构不要数据
CREATE TABLE employees_empty AS
SELECT * FROM employees WHERE 1 = 0;
-- 复制结构和数据
CREATE TABLE employees_copy AS
SELECT employee_id, last_name, salary FROM employees;只作示例阅读:5 行写入限制下只开放单独创建普通空表;CTAS、删表、清空表、改结构、触发器和存储程序不允许执行。请在独立学习数据库中练习。
修改表结构
-- 加列(有默认值时,11g+ 可做到不重写全表)
ALTER TABLE employees_demo ADD (phone VARCHAR2(20));
-- 改类型与长度(表为空或长度放大时才容易成功)
ALTER TABLE employees_demo MODIFY (email VARCHAR2(50));
-- 改列名
ALTER TABLE employees_demo RENAME COLUMN phone TO mobile;
-- 改表名与删表改用一张临时表演示,
-- 以免把后面章节还要用的 employees_demo 改掉
CREATE TABLE emp_scratch AS SELECT * FROM employees_demo WHERE 1 = 0;
RENAME emp_scratch TO emp_demo;
-- 删列与置为未使用(大表删除列耗时长,可先标记)
ALTER TABLE emp_demo SET UNUSED COLUMN remarks;
ALTER TABLE emp_demo DROP UNUSED COLUMNS;
-- 删除表(默认进回收站,可用 FLASHBACK TABLE ... TO BEFORE DROP 恢复)
DROP TABLE emp_demo;
-- 想彻底删除、不进回收站就用下面这条(与上一条二选一,不要连着执行)
-- DROP TABLE emp_demo PURGE;只作示例阅读:5 行写入限制下只开放单独创建普通空表;CTAS、删表、清空表、改结构、触发器和存储程序不允许执行。请在独立学习数据库中练习。
临时表
Oracle 的临时表(GTT)是「一次定义、长期存在」的,数据则按会话或事务隔离。这和 SQL Server 的 #temp 概念不同,初学者经常误以为要每次创建。
- 临时表定义是全局共享的,数据是会话私有的
- 临时表也会产生 redo(但比普通表少)和 undo,不能当内存表用
- 数据量小的中间结果,优先考虑 WITH 子句而不是临时表
CREATE GLOBAL TEMPORARY TABLE gtt_cart (
session_item_id NUMBER,
item_name VARCHAR2(100),
qty NUMBER
) ON COMMIT PRESERVE ROWS;
-- 会话结束时清空
-- 改成事务级:ON COMMIT DELETE ROWS(提交即清空)只作示例阅读:5 行写入限制下只开放单独创建普通空表;CTAS、删表、清空表、改结构、触发器和存储程序不允许执行。请在独立学习数据库中练习。