使用一个SQL查询更新PostgreSQL表

时间:2016-06-09 16:22:53

标签: sql postgresql postgresql-9.3 postgresql-9.2 postgresql-9.4

我有两个表,我想用一个使用Java代码的SQL查询更新:

CREATE TABLE ACCOUNT(
 ID INTEGER NOT NULL,
 USER_NAME TEXT NOT NULL,
 PASSWD TEXT,
 FIRST_NAME TEXT,
 LAST_NAME TEXT,
 E_MAIL TEXT NOT NULL,
 COUNTRY TEXT,
 STATE TEXT,
 LAST_PASSWD_RESET DATE,
 DESCRIPTION TEXT,
 LAST_UPDATED DATE,
 CREATED DATE
)
;

-- ADD KEYS FOR TABLE ACCOUNT

ALTER TABLE ACCOUNT ADD CONSTRAINT KEY1 PRIMARY KEY (ID)
;

ALTER TABLE ACCOUNT ADD CONSTRAINT USER_NAME UNIQUE (USER_NAME)
;

ALTER TABLE ACCOUNT ADD CONSTRAINT E_MAIL UNIQUE (E_MAIL)
;

-- TABLE ACCOUNT_ROLE

CREATE TABLE ACCOUNT_ROLE(
 ID INTEGER NOT NULL,
 USER_NAME TEXT NOT NULL,
 ROLE INTEGER,
 PERMISSION TEXT,
 LAST_UPDATED DATE,
 CREATED DATE
)
;

-- CREATE INDEXES FOR TABLE ACCOUNT_ROLE

CREATE INDEX IX_RELATIONSHIP19 ON ACCOUNT_ROLE (ID)
;

-- ADD KEYS FOR TABLE ACCOUNT_ROLE

ALTER TABLE ACCOUNT_ROLE ADD CONSTRAINT KEY26 PRIMARY KEY (ID)
;

ALTER TABLE ACCOUNT_ROLE ADD CONSTRAINT RELATIONSHIP19 FOREIGN KEY (ID) REFERENCES ACCOUNT (ID) ON DELETE CASCADE ON UPDATE CASCADE
;

我使用此SQL查询来更新第一个表数据。对于第二个表,我使用类似的SQL查询:

UPDATE ACCOUNT SET ID = ?, USER_NAME = ?, PASSWD = ?, FIRST_NAME = ?, LAST_NAME = ?, E_MAIL = ?, COUNTRY = ?, STATE = ?, " CITY = ?, ADDRESS = ?, STATUS = ?, SECURITY_QUESTION = ?, SECURITY_ANSWER = ?, DESCRIPTION = ?, LAST_UPDATED = CURRENT_DATE WHERE ID = ?

这可以解决这个问题?

2 个答案:

答案 0 :(得分:1)

you can't除非您有两个使用inheritance

的表格

我不知道任何允许同时更改两个或多个表的SQL DB。

不确定您是否需要这样的功能。

如果您希望将更改保持在一起 - 只需打开transaction并将这两个更新放在一起,如果一个失败,则可以回滚整个事务。

当然可以将explicit lockingSELECT .. FOR UPDATE一起使用,这也很好。

如果您正在寻找简化代码的东西 - 也许您应该查看stored procedures,这样您就可以编写复杂的代码并使用一些参数调用它。

答案 1 :(得分:1)

在Postgres中,您可以使用CTE更新两个表:

with t1 as (
      update . . .
      returning *
     )
update t2
    . . .

目前尚不清楚这是如何适合您的尝试。但是可以在Postgres中写一个声明进行两次更新。