SQLSTATE[22P02] : Invalid text representation

标签 sql database postgresql

我正在使用 PostgresqlPHP 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为此:

  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;
    

关于SQLSTATE[22P02] : Invalid text representation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13167186/

相关文章:

sql - 如何有效地找出哪条记录已被删除?

php - JS OnClick 事件将执行 php 代码块

另一个数据库表中的 MySQL 外键?

json - 在 json 文件中导出 neo4j 数据库

java - 内部 HSQL 数据库提示特权

sql - SQL选择输入参数上带有通配符的查询

mysql - 如何检查表是否包含特定数量的行?

postgresql - 使用 PostgreSQL 选择随机点

sql - 查找 PostgreSQL 中两个大表之间的差异

postgresql - 无法运行 heroku rake db :migrate even with 'pg' gem installed