我正在尝试通过将新记录更新或插入新的记录到 voice_user_table中 来更新数据库。该表定义如下:
Column | Type | Modifiers
-----------+---------+--------------------------------------------------------------
id | integer | not null default nextval('vote_user_table_id_seq'::regclass)
review_id | integer | not null
user_id | integer | not null
positive | boolean | default false
negative | boolean | default false
Indexes:
"vote_user_table_pkey" PRIMARY KEY, btree (id)
这是我正在使用的查询。我实际上对所有值都使用了参数,但是出于测试目的,我将其替换为我确定应该可以使用的值。用户名 aaa@aaa.com 存在。
WITH updated AS (
UPDATE vote_user_table
SET
positive = 'true',
negative = 'false'
FROM usuario
WHERE
review_id = 6 AND
user_id = usuario.id AND
usuario.username ILIKE 'aaa@aaa.com'
RETURNING vote_user_table.id
)
INSERT INTO vote_user_table
(review_id, user_id, positive, negative)
SELECT 6, usuario.id, 'true', 'false'
FROM usuario, updated
WHERE
updated.id IS NULL AND
usuario.username ILIKE 'aaa@aaa.com'
运行查询后,我得到的输出是:
INSERT 0 0
尽管应该插入新值,但是因为该行在数据库上尚不存在。当我仅使用insert子句手动插入一行,然后执行上面显示的upsert查询时,它正确地更新了该行。
我正在使用PostgreSQL版本9.2.4。
关于我可能做错了什么的任何想法?
关于如何实现我想要做的任何建议?
为 vote_user_table 创建语句:
CREATE TABLE vote_user_table (
id integer NOT NULL,
review_id integer NOT NULL,
user_id integer NOT NULL,
positive boolean DEFAULT false,
negative boolean DEFAULT false
);
CREATE SEQUENCE vote_user_table_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER SEQUENCE vote_user_table_id_seq OWNED BY vote_user_table.id;
第UPDATE
一个CTE中的 不会updated
产生 任何行
。这意味着您都不会获得任何NULL
价值updated.id
。加入时updated
,您 一无所获 ,因此也不会INSERT
发生任何事情。
应该与NOT EXISTS
:
WITH updated AS (
UPDATE vote_user_table v
SET positive = TRUE -- use booleann values ..
,negative = FALSE -- .. instead of quoted string literals
FROM usuario u
WHERE v.review_id = 6 -- guessing origin
AND v.user_id = u.id
AND u.username ILIKE 'aaa@aaa.com'
RETURNING v.id
)
INSERT INTO vote_user_table (review_id, user_id, positive, negative)
SELECT 6, u.id, TRUE, FALSE
FROM usuario u
**WHERE NOT EXISTS (SELECT 1 FROM updated)**
AND u.username ILIKE 'aaa@aaa.com';
请注意,在高并发负载下出现 竞争状况的 机会仍然很小。
OTA更新查询与下载 获取access_token 终端设备 终端设备直接接入OTA服务器应当使用Client Credentials模式,client_id为设备id,client_serect为设备令牌. App接入 如果终端设备无法直接接入OTA服务器,而通过App中转,那么App应当也使用Client Credentials模式,client_id为app_id,client_secret
问题内容: 我有一个涉及Postgresql数据库的任务。我对SQL不太有经验。 我有一张桌子,上面有每周贸易产品的营业额。 对于每周,提供以下信息:产品,周数,每周营业额(可能是正数,也可能是负数,具体取决于天气是购买还是出售了更多产品)。我已经添加了一个列,每个星期都有期末余额。我在表中的第一周所有产品的期末余额(week_number= 0),而其他所有周均为“ null”。下面提供了一些示
问题内容: 我有2张桌子,如下所示: serial_table serial_key CHARACTER VARYING(20), PRIMARY KEY(id, serial_key) serial_rate: serial_key CHARACTER VARYING(20), rate NUMERIC, PRIMARY KEY(id, serial_key), FOREIGN KEY (id,
我希望在一条语句中更新PostgreSQL中的多行。有没有一种方法可以做到以下几点?
以下示例将演示如何使用Update查询,在DBUtils的帮助下更新记录。 我们将更新表中的记录。 语法 其中, updateQuery − 更新包含占位符的查询。 queryRunner − QueryRunner对象更新数据库中的员工对象。 为了理解上述与DBUtils相关的概念,我们编写一个将运行更新查询的示例。创建一个示例应用程序。 更新在DBUtils入门应用中创建的文件。 编译并运行应
问题内容: 我有一个包含三列的表: 还有另一个表,其中包含2列。的列与的相同。 我需要一个查询,它将更新带有的列。 我可以通过检查ID并执行更新语句来通过循环来实现。如何才能通过查询完成? 问题答案: 怎么样