2

PostgresqlPHP 5.3.x を PDOと共に使用して DB にアクセスしています。

これは、PDO が入力するプレースホルダーを含む SQL クエリ (簡略化されたバージョン) です。

INSERT INTO t_articles (a_article_id) VALUES (?) RETURNING a_id

a_article_idのような数値にするか、5サブクエリの結果にする必要があります。

((SELECT max(a_article_id) FROM t_articles) + 1)

ただし、PDO は次のように述べています。

SQLSTATE[22P02]: Invalid text representation: 7 ERROR: invalid input syntax for integer: "(SELECT max(a_article_id) FROM t_articles) + 1"

そして、サブクエリをデフォルト値として設定しようとしましたが、明らかに許可されていません:

ERROR:  cannot use sub query in default expression

このサブクエリの結果を挿入するにはどうすればよいですか (または同じ結果を得るにはどうすればよいですか)?

4

1 に答える 1

9

そのために INSERT...SELECT を使用する必要があります。

insert into t_articles (a_article_id)
select max(a_article_id) + 1
from t_articles
returning id

または、連続した値が必要ない場合は、シーケンスa_article_id使用します。

  1. シーケンスを作成します。これを と呼びますarticle_id_sequence

    -- Get the current max(a_article_id)+1 to use instead of FIRST_VAL below
    create sequence article_id_sequence
    start FIRST_VAL
    owned by t_articles.a_article_id;
    
  2. のデフォルト値をt_articles.a_article_idに設定しますnextval('article_id_sequence')

    alter table t_articles
    alter column a_article_id
    set default nextval('article_id_sequence');
    
  3. 以下を挿入するときは、デフォルト値を使用します。

    insert into t_articles (a_article_id)
    values (default)
    returning id;
    
于 2012-10-31T21:17:40.790 に答える