2016-06-22 5 views
1

私は以下のことをMySQLで行うことができますが、PostgreSQLでこれを行う方法を知りたいと思います。テーブル名が可変であるため(単にCREATE TABLEを実行できないため)、クエリを文字列にラップする必要があります。これは、すべてMySQLのストアドプロシージャ/ Postgres関数内にあります。postgresの関数内にprepared statementがあります

SET @createTable = CONCAT("CREATE TABLE ", table_name, "(
       id int(11) NOT NULL AUTO_INCREMENT, 
       something varchar(255) NOT NULL"); 
    PREPARE createTableStmt FROM @createTable; 
    EXECUTE createTableStmt; 
    DEALLOCATE PREPARE createTableStmt; 

誰かがPostgresでこれを行う方法を教えてください。

+0

。 https://www.postgresql.org/docs/9.5/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN – Bill

答えて

2

を一度実行するには、連結したCREATE TABLE文を実行してください。 EXECUTEとplpgsqlが機能を使用し、変数テーブル名を指定して繰り返し使用するための機能をカプセル化する

CREATE OR REPLACE FUNCTION create_my_table(_tbl text) 
    RETURNS void AS 
$func$ 
BEGIN 
    EXECUTE format('CREATE TABLE %I (id serial, something varchar(255) NOT NULL)', _tbl); 
END 
$func$ LANGUAGE plpgsql; 

コール:

SELECT create_my_table('foo_table'); 

ドロップする:

DROP create_my_table(text); 

There are many related answers here. Try a search.

それとも、現在のセッションのみのためにそれが必要な場合は、それ自動的にセッションの終了時に破棄され、一時的な機能させることができます。

CREATE OR REPLACE FUNCTION pg_temp.create_my_table(_tbl text) ... 

のPostgresでAUTOINCREMENTを実装するためのシリアル列を使用します。

あなたにも列PRIMARY KEYを作りたいかもしれません。
varchar(255)はほとんど意味がありません。私はちょうど代わりにtextを使用します。これは、Postgresの動的SQLと呼ばれています

+0

あなたは素晴らしいです!ありがとう! – 1N5818

関連する問題