更新表中多行的最简单方法是什么?我有一个如下所示的 csv 文件:
|primary_key |value|
| 1 | xyz|
| 2 | abc|
| 3 | def|
...
Run Code Online (Sandbox Code Playgroud)
目标表中已存在具有这些主键的行
我想用这些值更新目标表。是否有语法,以便我可以编写如下内容:
update mytable set value = ('xyz', 'abc', 'def') where primary key = (1,2,3);
Run Code Online (Sandbox Code Playgroud)
查看MySQL 更新参考、本站点(MySQL-csv 更新)、SO(更新多行、多个数据库更新、更新多行),我怀疑答案是“否”,但我想确认这一点是真的。
我想在触发器的表中插入一个 RECORD 数据类型变量(新变量)。SQL 会是什么样子?
以下尝试均未成功:
EXECUTE 'INSERT INTO my_table VALUES ' || NEW;
EXECUTE 'INSERT INTO my_table VALUES ' || NEW.*;
EXECUTE 'INSERT INTO my_table SELECT * FROM ' || NEW;
Run Code Online (Sandbox Code Playgroud) My table employees contain more than ten million data. i want to update 10k rows in commission_pct column where commission_pct is null and set zero(0) value.
in oracle I can easily solve this by using rownum.
update employees
set commission_pct=0
where commission_pct is null and rownum<=10000;
Run Code Online (Sandbox Code Playgroud)
but postgresql does not support rownum.
how to solve this in postgresql?
我目前有一个看起来像这样的表:
CREATE TABLE "PDPC".collection
(
col_no bigint NOT NULL DEFAULT nextval('"PDPC".collection_col_no_seq'::regclass),
q1 character varying(10000) COLLATE pg_catalog."default",
q2 character varying(10000) COLLATE pg_catalog."default",
q3 character varying(10000) COLLATE pg_catalog."default",
q4 character varying(10000) COLLATE pg_catalog."default",
dg_fkey bigint,
CONSTRAINT collection_pkey PRIMARY KEY (col_no),
CONSTRAINT collection_dg_fkey_fkey FOREIGN KEY (dg_fkey)
REFERENCES "PDPC".datagroup (dg_no) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION
)
WITH (
OIDS = FALSE
)
TABLESPACE pg_default;
ALTER TABLE "PDPC".collection
OWNER to postgres;
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用 postgresql 在 PHP 中执行 UPSERT 语句,但我收到了
致命错误:未捕获的 PDOException:SQLSTATE[42P10]:无效的列引用:7 …
我遇到了在 PostgreSQL 中使用 JSON 数据类型的问题。我尝试实现在数据库中存储非规范化的 Java 模型。该模型具有复杂对象列表。因此,我决定将它们建模为原生 PostgreSQL 数组中的 JSON。
这是我的表创建语句的精简片段:
CREATE TABLE test.persons
(
id UUID,
firstName TEXT,
lastName TEXT,
communicationData JSON[],
CONSTRAINT pk_person PRIMARY KEY (id)
);
Run Code Online (Sandbox Code Playgroud)
如您所见,它是一个以 JSON 格式显示通信数据对象列表的人。其中一个对象可能如下所示:
{"value" : "03334/254147", "typeId" : "ea4e7d7e-7b87-4628-ba50-6a5f6e63dbf6"}
Run Code Online (Sandbox Code Playgroud)
我可以使用 PostgreSQL 的 array_append 轻松地将这样的 JSON 对象附加到数组中。但是,我无法从数组中删除已知值。考虑一下这个 SQL 语句:
UPDATE test.persons
SET communicationData = array_remove(
communicationData,
'{"value" : "03334/254147", "typeId" : "ea4e7d7e-7b87-4628-ba50-6a5f6e63dbf6"}'::JSON
)
WHERE id = 'f671eb6a-d603-11e3-bf6f-07ba007d953d';
Run Code Online (Sandbox Code Playgroud)
这失败了ERROR: could not identify an equality operator for type json。您是否有提示我如何从 JSON 数组中删除已知值?也可以按数组中的位置删除,因为我知道一个也......
PostgreSQL …
我有一个名为“示例”的表
CREATE TABLE IF NOT EXISTS `example` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`a` int(11) NOT NULL,
`b` int(11) NOT NULL,
`c` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Run Code Online (Sandbox Code Playgroud)
如果不存在,我想插入值,如果值存在则更新,所以我使用以下语句:
INSERT INTO example (a, b, c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE a = VALUES(a), b = VALUES(b), c = VALUES(c);
Run Code Online (Sandbox Code Playgroud)
执行上述查询后,该表如下所示:
再次执行上面的语句,结果如下:
我的陈述有什么问题?
我正在尝试将一行大小为 5k 的目标表更新为一行大小为 5k 的目标表。
由于它是一行,因此很容易知道行的实际大小:
select *
from sys.dm_db_index_physical_stats(DB_ID('RODS_HSD_ES'),
OBJECT_ID(N'TBL_BM_HSD_SUBJECT_AN_148_REPRO'), NULL, NULL, 'DETAILED')
Run Code Online (Sandbox Code Playgroud)
表自创建以来没有改变。没有看到它应该失败的任何原因。想法?
由于语法和回滚事务,我的最终更新语句应该出错,预期的错误应该类似于:
消息 207,级别 16,状态 1,第 45 行无效的列名称“FakeTest1”
我很好奇当允许执行引用不存在的列的子查询时,为什么 SQL Server 更新列中的每一行。
我正在创建一个包含两列的临时表,FakeID并且FakeVarchar.
SELECT [FakeID], [FakeVarchar]
INTO [#T]
FROM [CTE];
Run Code Online (Sandbox Code Playgroud)
当我的UPDATE语句使用此WHERE子句在 中指定列 [ID] 时SELECT SUBQUERY,它会更新整个表,而不是在解析命令时出错。
WHERE [FakeTableDestination].[ID] IN
(
SELECT [ID]
FROM [#T]
);
Run Code Online (Sandbox Code Playgroud)
应该在子查询中以使其正确运行的列将是FakeID. 此语句显然有效,并且按预期更新。
WHERE [FakeTableDestination].[ID] IN
(
SELECT [FakeID]
FROM [#T]
);
Run Code Online (Sandbox Code Playgroud)
当我用任何其他列名替换 FakeID / ID 时,它会按预期失败。
WHERE [FakeTableDestination].[ID] IN
(
SELECT [NotActuallyAColumnInThisTableEither]
FROM [#T]
);
Run Code Online (Sandbox Code Playgroud)
IF OBJECT_ID('dbo.FakeTableSource', 'U') IS NOT …Run Code Online (Sandbox Code Playgroud) 我在 Postgres 表中有一个jsonb列。它包含以下数据:datamy_table
[
{"id":"1","status":"test status1","updatedAt":"1571145003"},
{"id":"2","status":"test status2","updatedAt":"1571145323"}
]
Run Code Online (Sandbox Code Playgroud)
我想updatedAt使用一个查询更新该数组中所有对象的键。我试过:
update my_table set data = data || '{"updatedAt": "1571150000"}';
Run Code Online (Sandbox Code Playgroud)
上面的查询在数组中添加了一个新对象,如下所示:
[
{"id":"1","status":"test status1","updatedAt":"1571145003"},
{"id":"2","status":"test status2","updatedAt":"1571145323"},
{"updatedAt":"1571150000"}
]
Run Code Online (Sandbox Code Playgroud)
我想要的输出如下:
[
{"id":"1","status":"test status1","updatedAt":"1571150000"},
{"id":"2","status":"test status2","updatedAt":"1571150000"}
]
Run Code Online (Sandbox Code Playgroud)
我也尝试过jsonb_set(),但这需要第二个参数是数组索引。我无法确定数组中 JSON 对象的数量。
如果可以通过自定义函数解决这个问题,也很好。
我有一个关于 SQL Server 的 UPDATE 语句的内部工作原理的问题。我试图了解如果同时收到或服务以下 2 个更新语句会发生什么:
| Session 1 - Statement 1 | Session 2 - Statement 2
| -------------------------+-------------------------
| update dbo.Table1 | update dbo.Table1
| set Value = 10 | set Value = 20
| where ID = 1 | where ID = 1
? and Value = 0; | and Value = 0;
(t)
Run Code Online (Sandbox Code Playgroud)
据我了解,更新将首先选择需要使用共享锁更新的行,这意味着两个更新语句都可以选择特定行。然后它请求一个排它锁来更新列值。因此,结果似乎将 Value 设置为 20。
我错过了什么还是我的理解正确?
连接的隔离级别设置为 READ UNCOMMITTED。
update ×10
postgresql ×5
sql-server ×3
insert ×2
json ×2
mysql ×2
array ×1
concurrency ×1
duplication ×1
foreign-key ×1
json-path ×1
plpgsql ×1
record ×1
replace ×1
trigger ×1