可修改的PostgreSQL中的字符串数组

时间:2016-11-13 16:41:26

标签: java postgresql

我希望在表格中存储一个字符串数组,然后我可以将更多数据附加到。

我的表格如下:

CREATE TABLE users (id SERIAL, username varchar(32), password char(40), name varchar(64), age integer, successful_logins varchar(32)[10], failed_logins varchar(32)[10], roles text[3]);

我试过这个,但它没有做任何事情:

UPDATE users SET successful_logins = array_append(successful_logins, :timestamp) WHERE username = :username;

:varname来自我正在使用的JDBI驱动程序,但我传入一个字符串。为什么这不起作用?有没有更好的方法来获得相同的结果?

编辑:

这是我正在使用的驱动程序:

<dependency>
    <groupId>postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>9.1-901.jdbc4</version>
</dependency>

我没有得到任何错误,它似乎与我的DAO或驱动程序有关。 这是DAO代码:

import org.skife.jdbi.v2.sqlobject.Bind;
import org.skife.jdbi.v2.sqlobject.SqlUpdate;

@SqlUpdate("UPDATE users SET successful_logins=ARRAY_APPEND((SELECT successful_logins FROM users WHERE username=:username),:timestamp)WHERE username=:username")
void addSuccessfulLogin(@Bind("timestamp") String timestamp, @Bind("username") String username);

当我在psql中尝试使用vars替换值时,它会起作用。我想知道这是否是一个铸造问题?我是否需要将我的字符串转换为某些内容?

2 个答案:

答案 0 :(得分:0)

我不熟悉您的JDBI库,但我在Postgres控制台中尝试了这个并且它有效:

UPDATE mytable SET successful_logins = 
ARRAY_APPEND(
    (
     SELECT successful_logins FROM mytable WHERE id=1), 
    'Some additional value'
     ) 
WHERE id=1

问题可能是您需要先选择现有的successful_logins值,然后再将其传递给array_append

编辑:嗯,看起来你错过了ARRAY_APPEND()和WHERE之间的空格......

答案 1 :(得分:0)

当我打电话给addSuccessfulLogin时,我正在做:

addSuccessfulLogin(username, timestamp);

而不是

addSuccessfulLogin(timestamp, username)

所以它试图找到一个基于时间戳的用户名,这个时间戳不存在。这就是没有错误的原因。因此,请确保正确调用自己的API!