我正在尝试将一些SQL从MySQL转换为PostgreSQL。因此,我需要变量赋值:
INSERT INTO main_categorie (description) VALUES ('Verbe normal'); SET @PRONOMINAL := SELECT LAST_INSERT_ID(); INSERT INTO main_mot (txt,im,date_c,date_v_d,date_l) VALUES ('je m''abaisse',1,NOW(),NOW(),NOW()); SET @verbe_149 = SELECT LAST_INSERT_ID(); INSERT INTO main_motcategorie (mot_id,categorie_id) VALUES (@verbe_149,@PRONOMINAL);
您将如何使用PostgreSQL做到这一点?v9和v8(几乎相同)的文档中没有有用的示例。
Postgres SQL中没有变量(只能在过程语言中使用变量)。
RETURNING在WITH查询中使用:
RETURNING
WITH
WITH insert_cat AS ( INSERT INTO main_categorie (description) VALUES ('Verbe normal') RETURNING id ), insert_mot AS ( INSERT INTO main_mot (txt,im,date_c,date_v_d,date_l) VALUES ('je m''abaisse',1,NOW(),NOW(),NOW()) RETURNING id ) INSERT INTO main_motcategorie (mot_id,categorie_id) SELECT m.id, c.id FROM insert_mot m, insert_cat c;
作为替代方案,您可以在说明的方式使用自定义的配置参数。
创建两个函数:
create or replace function set_var (name text, value text) returns void language plpgsql as $$ begin execute format('set mysql.%s to %s', name, value); end $$; create or replace function get_var (name text) returns text language plpgsql as $$ declare rslt text; begin execute format('select current_setting(''mysql.%s'')', name) into rslt; return rslt; end $$;
使用函数可以模拟变量,如示例中所示:
INSERT INTO main_categorie (description) VALUES ('Verbe normal'); SELECT set_var('PRONOMINAL', (SELECT currval('main_categorie_id_seq')::text)); INSERT INTO main_mot (txt,im,date_c,date_v_d,date_l) VALUES ('je m''abaisse',1,NOW(),NOW(),NOW()); SELECT set_var('verbe_149', (SELECT currval('main_mot_id_seq')::text)); INSERT INTO main_motcategorie (mot_id,categorie_id) SELECT get_var('verbe_149')::int, get_var('PRONOMINAL')::int;
这当然不是良好代码的示例。特别是铸造的麻烦。但是,转换可以半自动完成。