我正在使用 Postgresql 和 PHP 5.3.x with PDO 来访问数据库。
我有这个 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
我怎样才能插入这个子查询的结果(或者怎样才能得到相同的结果)?
最佳答案
为此你必须使用 INSERT...SELECT:
insert into t_articles (a_article_id)
select max(a_article_id) + 1
from t_articles
returning id
或者,如果您不需要 a_article_id
的连续值,请使用 sequence为此:
创建一个序列,我们称之为
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;
将
t_articles.a_article_id
的默认值设置为nextval('article_id_sequence')
。alter table t_articles alter column a_article_id set default nextval('article_id_sequence');
插入时使用默认值:
insert into t_articles (a_article_id) values (default) returning id;
关于SQLSTATE[22P02] : Invalid text representation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13167186/