【问题标题】:Prepared statement and serial data type准备好的语句和串行数据类型
【发布时间】:2020-03-24 12:50:28
【问题描述】:

这是我的 PostgreSQL 代码:

CREATE TABLE "user" (
    id serial UNIQUE,
    username varchar,
    password varchar,
    email varchar,
);

我想创建 Java 方法,它将新用户添加到我的表用户:

public static void addUser(Connection con) throws SQLException {
        String sql = "INSERT INTO user VALUES (?, ?, ?)";

        try(PreparedStatement ps = c.prepareStatement(sql)) {
            ps.setString(1, "test");
            ps.setString(2, "test");
            ps.setString(3, "test@email.com");

            ps.executeUpdate();
            }
        }
    }

因为列 id 是串行的,所以我不会为此列创建准备好的语句(即使没有 java,我也会只插入剩余的值,因为 id 会自动生成)。但是,当我运行此代码时,出现以下错误:

ERROR: column "id" is of type integer but expression is of type character varying

我做错了什么?

【问题讨论】:

    标签: java sql


    【解决方案1】:

    始终在 INSERT 语句中指定目标列。由于user是保留关键字,所以你必须引用它(但如果你找到一个不同的名字会更好)

    String sql = "INSERT INTO \"user\" (username, password, email) VALUES (?, ?, ?)";
    

    【讨论】:

    • 好的,我修复了我的插入语句,但它看起来仍然不尊重 id 列中的串行数据类型。我的表中已经有几个用户,但是我的代码仍然添加了 id 为 1 的用户(违反了唯一约束)。还有什么我需要解决的吗?
    • @enneenne:您显然插入了为 ID 列提供值的行,绕过了序列。这就是为什么identity 列(带有generated always)现在是preferred 而不是serial。要解决此问题,请参阅例如这里:stackoverflow.com/questions/244243 或这里 stackoverflow.com/questions/9314382
    • 是的,这似乎是问题所在。
    猜你喜欢
    • 1970-01-01
    • 2013-05-19
    • 2013-11-23
    • 2012-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多