临时表(Temporary Table)是会话级别的表,只在当前会话中可见,会话结束后自动删除。在TBASE(基于PostgreSQL)中创建临时表的语法与PostgreSQL相同。
1. 基本临时表创建语法
-- 创建普通临时表(会话结束时自动删除)
CREATE TEMPORARY TABLE temp_table_name (
column1 datatype [constraints],
column2 datatype [constraints],
...
);
-- 或者使用缩写 TEMP
CREATE TEMP TABLE temp_table_name (
id INT PRIMARY KEY,
name VARCHAR(100),
create_time TIMESTAMP
);
2. 创建临时表并从查询填充数据
-- 创建临时表并从查询结果填充数据
CREATE TEMP TABLE temp_results AS
SELECT user_id, product_id, SUM(amount) AS total_amount
FROM sales
WHERE sale_date BETWEEN '2023-01-01' AND '2023-12-31'
GROUP BY user_id, product_id;
3. 临时表的高级选项
-- 创建临时表时指定表空间(如果需要)
CREATE TEMP TABLE temp_logs (
log_id SERIAL,
log_message TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ON COMMIT DELETE ROWS; -- 事务结束时删除数据
-- 创建事务级别的临时表(事务结束时删除)
CREATE TEMP TABLE session_temp (
id INT,
data TEXT
) ON COMMIT PRESERVE ROWS; -- 默认行为,会话结束时删除
-- 创建带索引的临时表
CREATE TEMP TABLE temp_users (
user_id INT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
email VARCHAR(100)
);
CREATE INDEX idx_temp_users_email ON temp_users(email);
4. 在Shell脚本中通过TBASE创建临时表
#!/bin/bash
# 通过shell脚本在TBASE中创建临时表
PSQL_CMD="psql -h tbase_host -p 5432 -U tbase_user -d tbase_db"
# 创建临时表
$PSQL_CMD <<EOF
CREATE TEMP TABLE temp_employees (
emp_id INT PRIMARY KEY,
emp_name VARCHAR(100) NOT NULL,
department VARCHAR(50),
salary NUMERIC(10,2)
);
INSERT INTO temp_employees VALUES
(1, '张三', '研发部', 15000.00),
(2, '李四', '市场部', 12000.00),
(3, '王五', '财务部', 13000.00);
EOF
# 查询临时表数据
$PSQL_CMD -c "SELECT * FROM temp_employees;"
5. 临时表使用注意事项
- 会话隔离:不同会话创建的临时表互不可见
- 命名冲突:临时表可以与普通表同名,此时优先访问临时表
- 分布式特性:在TBASE中,临时表只在当前节点创建,不参与分布式存储
- 性能考虑:频繁创建/删除临时表可能影响性能,考虑使用WITH子句(CTE)替代简单场景
6. 使用WITH子句替代临时表(适用于简单场景)
-- 使用WITH子句(公共表表达式)代替临时表
WITH temp_data AS (
SELECT product_id, AVG(price) AS avg_price
FROM products
GROUP BY product_id
)
SELECT p.product_name, d.avg_price
FROM products p
JOIN temp_data d ON p.product_id = d.product_id
WHERE d.avg_price > 1000;
临时表在TBASE中常用于存储中间结果、会话级数据处理等场景,合理使用可以提高查询性能和代码可读性。