PostgreSQL插入多行(如果不存在)

PostgreSQL插入多行(如果不存在),postgresql,jdbc,Postgresql,Jdbc,我试图通过java应用程序将行插入到一个两列表PRODUCTS\u CAT中,如果这些行还不存在的话。这些行是从xml队列中读取的 这是我获取队列的方法 public void syncProduct(final ProductInfoExt prod) throws BasicException { Transaction t = new Transaction(s) { public Object transact() throws BasicException {

我试图通过java应用程序将行插入到一个两列表PRODUCTS\u CAT中,如果这些行还不存在的话。这些行是从xml队列中读取的

这是我获取队列的方法

public void syncProduct(final ProductInfoExt prod) throws BasicException {
    Transaction t = new Transaction(s) {
        public Object transact() throws BasicException {
            // Sync the Product in a transaction

            // Try to update
            if (new PreparedSentence(
                s,
                "UPDATE PRODUCTS SET REFERENCE = ?, CODE = ?, NAME = ?, PRICEBUY = ?, PRICESELL = ?, CATEGORY = ?, TAXCAT = ?, IMAGE = ? WHERE ID = ?",
                SerializerWriteParams.INSTANCE).exec(new DataParams() {
                    public void writeValues() throws BasicException {
                        setString(1, prod.getReference());
                        setString(2, prod.getCode());
                        setString(3, prod.getName());
                        // setBoolean(x, p.isCom());
                        // setBoolean(x, p.isScale());
                        setDouble(4, prod.getPriceBuy());
                        setDouble(5, prod.getPriceSell());
                        setString(6, prod.getCategoryID());
                        setString(7, prod.getTaxCategoryID());
                        setBytes(8, ImageUtils.writeImage(prod.getImage()));
                        // setDouble(x, 0.0);
                        // setDouble(x, 0.0);
                        setString(9, prod.getID());
                    }
            }) == 0) {
                // If not updated, try to insert
                new PreparedSentence(
                        s,
                        "INSERT INTO PRODUCTS (ID, REFERENCE, CODE, NAME, ISCOM, ISSCALE, PRICEBUY, PRICESELL, CATEGORY, TAXCAT, IMAGE, STOCKCOST, STOCKVOLUME) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
                        SerializerWriteParams.INSTANCE)
                        .exec(new DataParams() {
                            public void writeValues() throws BasicException {
                                setString(1, prod.getID());
                                setString(2, prod.getReference());
                                setString(3, prod.getCode());
                                setString(4, prod.getName());
                                setBoolean(5, prod.isCom());
                                setBoolean(6, prod.isScale());
                                setDouble(7, prod.getPriceBuy());
                                setDouble(8, prod.getPriceSell());
                                setString(9, prod.getCategoryID());
                                setString(10, prod.getTaxCategoryID());
                                setBytes(11, ImageUtils.writeImage(prod
                                        .getImage()));
                                setDouble(12, 0.0);
                                setDouble(13, 0.0);
                            }
                        });
            }
                    /* Insert in catalog */
            new StaticSentence(
                    s,
                    /*
                     * leyonce - Insert into the product catalog if the
                     * products aren't already there
                     */
                    "INSERT INTO  PRODUCTS_CAT(PRODUCT,CATORDER) SELECT  ?,NULL WHERE NOT EXISTS (SELECT (?,NULL) FROM PRODUCTS_CAT)  ",
                    SerializerWriteString.INSTANCE).exec(prod.getID());
            return null;
        }
    };
    t.execute();
}
插入第一行,而不插入所有其他行。如果表为空,它显然会进行插入。

SELECT?,PRODUCTS\u CAT中的NULL始终存在,只要PRODUCTS\u CAT中有一行,就返回一行。要测试此id是否已插入,您应执行以下操作:

从PRODUCTS_CAT中选择1,其中PRODUCT=? 完整插入语句:

插入到PRODUCTS_CATPRODUCT、CATORDER SELECT?中,不存在时为空从PRODUCTS_CAT中选择1,其中PRODUCT=? 您还需要将id绑定到每个问号?:

新句子 s 插入到PRODUCTS\u CATPRODUCT,CATORDER SELECT?,不存在时为空,从PRODUCTS\u CAT中选择1,其中PRODUCT=?, 新SerializerWriteBasicDatas.STRING、Datas.STRING .execprod.getID,prod.getID;
我可能错了,但在您提供的代码中我看不到任何其他行。我不确定我是否理解您的意思。这些行是以xml文件格式从队列中读取的。我也应该包括这一点吗?我理解这一点:prod包含一行的数据,您提供的代码被多次调用,每行调用一次。如果我是对的,你确定你的代码真的被多次调用了吗?如果我错了,你能展示一个包含所有行的类吗?是的,我肯定它被调用了多次。如果我在没有where条件的情况下执行插入,则将插入产品\u CAT VALUES?,NULL它包括所有行。是的,它测试该Id是否已经存在,但是如果我尝试再次插入同一行和其他行,它将返回一个错误,并且不插入其他行。org.postgresql.util.PSQLException:error:duplicate键值违反了唯一约束产品\u cat\u pkey Detail:key product=138已经存在。@Leyonce它可能存在那只是一个占位符吗?匹配id参数。尝试使用.execprod.getID、prod.getID之类的命令。你使用的是什么库?我使用的是java.sql*。我尝试了.execprod.getID,prod.getID。应用程序将永远加载。我不明白一个占位符,我可以有一些参考吗?java.sql中没有statisttation或SerializerWriteString,所以您使用的是其他东西。我不能显示我不知道的图书馆的参考资料。重点是关于两个问号?在您的插入请求中。显然,prod.getID将取代第一个问号。但是我想null将取代第二个问号,这将导致您的问题。你是如何编写.execprod.getID,prod.getID的?你有没有用过一种叫做mbpos的东西?