con*_*com 2 sql database postgresql
我正在使用Postgresql和PHP 5.3.x与PDO来访问数据库.
我有这个SQL查询(精简版),有一个占位符供PDO填写:
INSERT INTO t_articles (a_article_id) VALUES (?) RETURNING a_id
Run Code Online (Sandbox Code Playgroud)
我想a_article_id成为一个数字,5或者它应该是子查询的结果:
((SELECT max(a_article_id) FROM t_articles) + 1)
Run Code Online (Sandbox Code Playgroud)
但是,PDO说:
SQLSTATE[22P02]: Invalid text representation: 7 ERROR: invalid input syntax for integer: "(SELECT max(a_article_id) FROM t_articles) + 1"
Run Code Online (Sandbox Code Playgroud)
我试图将子查询设置为默认值,但显然不允许:
ERROR: cannot use sub query in default expression
Run Code Online (Sandbox Code Playgroud)
如何插入此子查询的结果(或者可以做些什么来实现相同的结果)?
你必须使用INSERT ... SELECT:
insert into t_articles (a_article_id)
select max(a_article_id) + 1
from t_articles
returning id
Run Code Online (Sandbox Code Playgroud)
或者,如果您不需要连续值a_article_id,请使用序列:
创建一个序列,我们称之为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;
Run Code Online (Sandbox Code Playgroud)对于设置的默认值t_articles.a_article_id来nextval('article_id_sequence').
alter table t_articles
alter column a_article_id
set default nextval('article_id_sequence');
Run Code Online (Sandbox Code Playgroud)插入时使用默认值:
insert into t_articles (a_article_id)
values (default)
returning id;
Run Code Online (Sandbox Code Playgroud)