INSERT INTO t1 SELECT * FROM...
如果列名不一致,是否有某种方法会失败?
我正在使用 Postgresql 9.x 列名事先不知道。
动机:我正在通过(相当标准的)PL/pgSQL 过程定期刷新物化视图:
CREATE OR REPLACE FUNCTION matview_refresh(name) RETURNS void AS
$BODY$
DECLARE
matview ALIAS FOR $1;
entry matviews%ROWTYPE;
BEGIN
SELECT * INTO entry FROM matviews WHERE mv_name = matview;
IF NOT FOUND THEN
RAISE EXCEPTION 'Materialized view % does not exist.', matview;
END IF;
EXECUTE 'TRUNCATE TABLE ' || matview;
EXECUTE 'INSERT INTO ' || matview || ' SELECT * FROM ' || entry.v_name;
UPDATE matviews SET last_refresh=CURRENT_TIMESTAMP WHERE mv_name=matview;
RETURN;
END
我更喜欢 aTRUNCATE
后跟 aSELECT * INTO
而不是 DROP/CREATE,因为它看起来更轻巧且对并发友好。如果有人从视图中添加/删除列(然后我会执行 DROP/CREATE),它将失败,但没关系,在这种情况下刷新不会完成,我们很快就会发现问题。重要的是今天发生的事情:有人更改了视图的两列(相同类型)的顺序,并且刷新插入了虚假数据。