PostgreSQL如果不存在,则插入多行

时间:2014-09-07 00:31:59

标签: postgresql jdbc

我试图通过我的java应用程序将行插入两列表PRODUCTS_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();
}

插入第一行而不插入所有其他行。如果表是空的,它显然会执行插入。

1 个答案:

答案 0 :(得分:2)

只要(SELECT (?,NULL) FROM PRODUCTS_CAT)中有一行,

PRODUCTS_CAT始终存在(返回一行)。要测试是否已插入此ID,您应该执行以下操作:

SELECT 1 FROM PRODUCTS_CAT WHERE PRODUCT = ?

完整插入声明:

INSERT INTO  PRODUCTS_CAT(PRODUCT,CATORDER) SELECT  ?,NULL WHERE NOT EXISTS (SELECT 1 FROM PRODUCTS_CAT WHERE PRODUCT = ?)

此外,您需要将ID绑定到每个问号" ?":

new StaticSentence(
    s,
    "INSERT INTO PRODUCTS_CAT(PRODUCT,CATORDER) SELECT ?,NULL WHERE NOT EXISTS (SELECT 1 FROM PRODUCTS_CAT WHERE PRODUCT = ?)",
    new SerializerWriteBasic(Datas.STRING, Datas.STRING)
    ).exec(prod.getID(), prod.getID());