在TBASE中创建临时表的方法

4 阅读2分钟

临时表(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. 临时表使用注意事项

  1. 会话隔离:不同会话创建的临时表互不可见
  2. 命名冲突:临时表可以与普通表同名,此时优先访问临时表
  3. 分布式特性:在TBASE中,临时表只在当前节点创建,不参与分布式存储
  4. 性能考虑:频繁创建/删除临时表可能影响性能,考虑使用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中常用于存储中间结果、会话级数据处理等场景,合理使用可以提高查询性能和代码可读性。