CREATE TABLE
功能描述
CREATE TABLE用于创建表
注意事项
- 创建当前用户的表需要有CREATE TABLE权限,创建其他普通用户的表需要有CREATE ANY TABLE权限,普通用户不可创建SYS表
- 自增列只支持int/bigint类型,一个表只支持一个自增列,自增列必须是主键或唯一索引
- 外键引用默认引用父表的主键,没有主键报错
- CHECK约束限制字段数量最大16个
- 创建本地临时表时需要开启LOCAL_TEMPORARY_TABLE_ENABLED,表名以#开头,不支持ON COMMIT DELETE ROWS
- 临时表的BLOB被定义为RAW(8000), CLOB被定义为VARCHAR(8000B)
语法格式
stmt:
sql
CREATE [[GLOBAL] TEMPORARY] TABLE [IF NOT EXISTS] [schema_name.]table_name
{({column_def_clause}[,...] [external_constraint][,...])} | {AS query}共享语句尾部及各子句的完整定义参见 CREATE TABLE 共享子句。
参数说明
- TEMPORARY: 本地临时表
- GLOBAL TEMPORARY: 全局临时表
- ON COMMIT DELETE ROWS: 事务级临时表,事务结束时会清空数据,不会删除表定义。默认行为
- ON COMMIT PRESERVE ROWS: 会话级临时表,会话结束时会清空数据,不会删除表定义
- CRMODE: MVCC模式。PAGE是页级MVCC,默认值为CR_MODE配置
- SERIAL: 自增列,和AUTO_INCREMENT的区别在于SERIAL默认数据类型是BIGINT
- DEFAULT expr [ON UPDATE expr]: 列默认值。ON UPDATE expr是兼容语法,UPDATE行数据未指定该列时取update默认值填充
- COLLATE: 字符序,支持UTF8_BIN(区分大小写)、UTF8_GENERAL_CI(不区分大小写)、UTF8_UNICODE_CI(不区分大小写)、GBK_BIN(区分大小写)、GBK_CHINESE_CI(不区分大小写)
- REFERENCES [schema_name.]table_name[(column_name)] ON DELETE CASCADE: 外键级联设置。外表删除时本表删除
- REFERENCES [schema_name.]table_name[(column_name)] ON DELETE SET NULL: 外键级联设置。外表删除时本表设置为NULL
- USING INDEX: 为约束指定索引属性
- INITRANS: 初始化数据库事务槽个数
- MAXTRANS: 数据库事务槽最大个数
- FORMAT ({ASF|CSF}): 行格式,默认为ASF(Aligned Stream Format),临时表不支持CSF(Compact Stream Format)
- STORAGE ({INITIAL int [K|M|G|T] | MAXSIZE {UNLIMITED | int [K|M|G|T]}}[ ...]): INITIAL指定表初始大小, MAXSIZE表存储的最大值, UNLIMITED代表无限存储
- RECORDS DELIMITED BY records_delimiter FIELDS TERMINATED BY fields_term: 外部表记录分隔符和字段分隔符。records_delimiter支持单字符或者newline,fields_term支持单字符
- ORGANIZATION EXTERNAL: 外部表相关。外部表列不支持LOB类型
- TYPE LOADER: 数据库转换类型。LOADER是文本转换
- DIRECTORY: 外部表所在目录名称,需要使用CREATE DIRECTORY提前创建
- ACCESS PARAMETERS: 转换参数
- LOCATION: 文件名称
- AUTO_INCREMENT [=] value: 自增初始值
- APPENDONLY {ON|OFF}: 追加写。如果开启后不同线程写一张表会申请新的页做写入,减少锁等待,但页空间浪费较多。默认关闭
- LOB (LOB_item) STORE AS: 指定lob字段(LOB_ITEM)单独segment存储
- ENABLE STORAGE IN ROW: 行内存储
- DISABLE STORAGE IN ROW: 行外存储
示例
-- 1. 简单员工表
CREATE TABLE employees (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
salary DECIMAL(10,2) CHECK (salary > 0),
dept_id INT
);
-- 2. 带外键和注释
CREATE TABLE departments (
dept_id SERIAL PRIMARY KEY,
dept_name VARCHAR(50) COMMENT '部门名称',
manager_id INT
);
-- 全局临时表
CREATE GLOBAL TEMPORARY TABLE temp_data (
session_id VARCHAR(50)
) ON COMMIT DELETE ROWS;
-- 会话级临时表
CREATE TEMPORARY TABLE #session_cache (
key VARCHAR(100) PRIMARY KEY,
value TEXT
) ON COMMIT PRESERVE ROWS;
-- 列级约束
CREATE TABLE users (
user_id INT PRIMARY KEY,
username VARCHAR(50) UNIQUE NOT NULL,
email VARCHAR(100) UNIQUE,
age INT CHECK (age >= 0),
status VARCHAR(10) DEFAULT 'ACTIVE'
);
-- 表级外键
CREATE TABLE orders (
order_id SERIAL,
user_id INT,
CONSTRAINT pk_order PRIMARY KEY (order_id),
CONSTRAINT fk_user FOREIGN KEY (user_id)
REFERENCES users(user_id) ON DELETE CASCADE
);
-- 指定表空间和存储
CREATE TABLE large_logs (
log_id SERIAL PRIMARY KEY,
log_time TIMESTAMP,
message TEXT
) TABLESPACE log_ts
PCTFREE 10
STORAGE (INITIAL 100M MAXSIZE 2G);
-- 带BLOB的表
CREATE TABLE documents (
doc_id SERIAL PRIMARY KEY,
doc_content BLOB
) LOB (doc_content) STORE AS (TABLESPACE lob_ts);
-- CATS
CREATE TABLE sales_summary
AS
SELECT product_id, SUM(quantity) as total_qty
FROM sales
GROUP BY product_id;
-- 创建页级MVCC表
CREATE TABLE page_mvcc_table (
id SERIAL PRIMARY KEY,
log_data TEXT,
created_time TIMESTAMP
) CRMODE PAGE;
-- 仅指定物理属性,使用默认表空间
CREATE TABLE logs (
log_id SERIAL PRIMARY KEY,
log_time TIMESTAMP
)
PCTFREE 5
INITRANS 2
MAXTRANS 255
STORAGE (INITIAL 100M MAXSIZE 1G);
-- 使用ASF格式创建表
CREATE TABLE user_profiles (
user_id SERIAL PRIMARY KEY,
profile_data JSONB,
preferences JSONB,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
FORMAT ASF;
-- 只指定DIRECTORY和LOCATION
CREATE TABLE external_simple (
id INT,
name VARCHAR(50)
)
ORGANIZATION EXTERNAL (
DIRECTORY data_dir
LOCATION 'simple.csv'
);