2

我正在使用带有 PDO 的PostgresqlPHP 5.3.x来访问数据库。

我有这个 SQL 查询(精简版),带有 PDO 的占位符来填写:

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_idnextval('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 回答