标签: update

如何在每次插入/更新中强制指定一列(不是默认为空)

下表:

CREATE TABLE kontrolle.negativtext
(
  id serial NOT NULL,
  ausschluss character varying(255) NOT NULL, 
  nur_domains character varying(255)[] NOT NULL DEFAULT '{}'::character varying[],
  nicht_domains character varying(255)[] NOT NULL DEFAULT '{}'::character varying[],
  bemerkung character varying(255), 
  last_change_user character varying(3) NOT NULL,
  last_change_timestamp timestamp without time zone,
  hits integer NOT NULL DEFAULT 0,
  is_regex boolean NOT NULL DEFAULT false, 
  check_doc negative_doc_check[] DEFAULT '{CONTENT_TXT_DIRTY, CONTENT_TXT_CLEAN}', 
  CONSTRAINT negativtext_pkey PRIMARY KEY (id)
);
Run Code Online (Sandbox Code Playgroud)

该表中数据记录的值应该可由多个用户更改。我想强制每个人更新或插入此表中的值以提供用户名(我们不需要讨论为什么这不是外键)。
将列设置为NOT NULL DEFAULT NULL将防止该值为空,这很好。但是,当用户abc插入一行并xyz稍后更新它时,xyz应该需要为 column …

postgresql update check-constraints

5
推荐指数
1
解决办法
3694
查看次数

如何在 postgres 上同时通过连接对多个表运行更新查询?

在 MySQL 中,我可以执行这样的查询

UPDATE 
    prd_sectionshapename  se
inner join 
    prd_shape s
ON
    s.id = se.shape_id
SET
   se.company_shape_name = 'ABC',
   s.name_en = 'Another name'
WHERE s.serial_number = '1234ST';
Run Code Online (Sandbox Code Playgroud)

在 Postgres 中,我需要分成 2 个查询

UPDATE prd_shape AS s
SET name_en = 'Another name'
WHERE s.serial_number = '1234ST';


UPDATE prd_sectionshapename AS se
SET company_shape_name = 'ABC'
FROM prd_shape s
WHERE se.shape_id = s.id and s.serial_number = '1234ST';
Run Code Online (Sandbox Code Playgroud)

我的问题是可以像 MySQL 一样在 1 个查询中完成它吗?

请注意,我在互联网上找到的其他 postgres 更新联接答案通常表明,即使使用了联接,更新效果也仅发生在单个表上。

我的目的是在一个查询中更新多个表。不只是一张桌子。

postgresql join update

5
推荐指数
1
解决办法
3万
查看次数

如何针对高频更新优化表?

我有一个表,其中包含需要定期运行的任务列表:

applaudience=> \d+ maintenance_task
                                                                       Table "public.maintenance_task"
               Column               |           Type           | Collation | Nullable |                   Default                    | Storage  | Stats target | Description
------------------------------------+--------------------------+-----------+----------+----------------------------------------------+----------+--------------+-------------
 id                                 | integer                  |           | not null | nextval('maintenance_task_id_seq'::regclass) | plain    |              |
 nid                                | citext                   |           | not null |                                              | extended |              |
 execution_interval                 | interval                 |           | not null |                                              | plain    |              |
 last_attempted_at                  | timestamp with time zone |           |          | now()                                        | plain    |              |
 last_maintenance_task_execution_id | integer                  |           |          | …
Run Code Online (Sandbox Code Playgroud)

postgresql vacuum update

5
推荐指数
1
解决办法
2997
查看次数

Postgres 批量更新插入性能

我正在对一个包含 3000 万行的表进行批量 UPSERT。该表只有两列(varchar 作为主键和整数)。首先将输入数据导入到临时表中,然后执行批量更新插入(使用 INSERT ... ON CONFLICT DO UPDATE 语句)。批量大小为 4000。

我的问题是 - 您能给我哪些性能建议?当表较小时(5-1000万条记录),性能就足够好了。对于 3000 万行,这还不够好,单批 4000 条记录持续 2 到 30 秒。

当然,我几乎没有并行执行此导入的服务,因此我使用咨询锁来同步它们(一次仅执行一个批量更新插入)。我是否应该删除咨询锁以并行执行更新插入?然后我将不得不处理死锁(并使用较小的批量大小来减少死锁机会?)。

我可以采取哪些措施来提高批量更新插入的性能?

这是我的大表:

CREATE TABLE my_big_table (
  sender VARCHAR(30) PRIMARY KEY,
  count  INTEGER NOT NULL DEFAULT 0
)
WITH (
  fillfactor = 80,
  autovacuum_vacuum_scale_factor = 0,
  autovacuum_vacuum_threshold = 40000
);
Run Code Online (Sandbox Code Playgroud)

这是 UPSERT 查询:

INSERT INTO my_big_table AS MBT (sender, count)
    SELECT destination, count(*) as received_count
    FROM my_temp_table
    GROUP BY destination
ON CONFLICT (sender) DO UPDATE
    SET …
Run Code Online (Sandbox Code Playgroud)

postgresql performance update upsert postgresql-performance

5
推荐指数
0
解决办法
1万
查看次数

升级到 SQL Server 2022 后链接服务器上的更新失败

将 SQL Server 从 2019 年升级到 2022 后,以下使用链接服务器的查询开始失败(为了简单起见,我省略了一些列名称和详细信息):

UPDATE [<remote server>].[<remote db>].dbo.Projects
SET    RemoteColumnName = p.LocalColumnName
FROM   prod.Projects p
WHERE  p.ProjectID = Projects.ProjectID;
Run Code Online (Sandbox Code Playgroud)

然而,不涉及本地表工作的基本更新就很好了。SQL Server 报告以下错误,我什至在文档中找不到该错误:

UPDATE [<remote server>].[<remote db>].dbo.Projects
SET    RemoteColumnName = p.LocalColumnName
FROM   prod.Projects p
WHERE  p.ProjectID = Projects.ProjectID;
Run Code Online (Sandbox Code Playgroud)

两台服务器都是 SQL Server 2022,在升级之前一切正常。

为本地和远程表添加 DDL,以防万一。但是,问题似乎与模式无关,并且在具有不同数据类型的不同表上重现。

-- Table on the remote linked server
CREATE TABLE dbo.Projects
(
    ProjectID               BIGINT           NOT NULL,
    RemoteColumnName        VARCHAR(255)     NOT NULL,
    CONSTRAINT PK_Projects PRIMARY KEY CLUSTERED (ProjectID)
)

-- Table on the local server
CREATE …
Run Code Online (Sandbox Code Playgroud)

sql-server linked-server update sql-server-2022

5
推荐指数
1
解决办法
1143
查看次数

是否可以仅使用一个 UPDATE 语句显式保存来自 ORDER BY 语句的排序?

我有这张桌子:

SELECT * FROM items

id | item      | position
---|-----------|----------
 1 | USB cable |        0
 2 | SD card   |        4
 3 | Mouse     |        2
 4 | Keyboard  |        0
 5 | Monitor   |        3
Run Code Online (Sandbox Code Playgroud)

对该表进行排序会得到以下结果:

SELECT * FROM items ORDER BY position

id | item      | position
---|-----------|----------
 4 | Keyboard  |        0
 1 | USB cable |        0
 3 | Mouse     |        2
 5 | Monitor   |        3
 2 | SD card   |        4
Run Code Online (Sandbox Code Playgroud)

现在我想更新表格并将订单保存在位置列中: …

order-by update

4
推荐指数
1
解决办法
1万
查看次数

优化我的更新顺序

每当用户更新他的个人资料时,我们都会进行一组查询,如下所示:

DELETE FROM `user_likes` WHERE `ID` = $id
INSERT INTO `user_likes` VALUES (DEFAULT, $id, $interest_id, $interest_name)
Run Code Online (Sandbox Code Playgroud)

有没有办法一步完成这一切?必须有办法,因为每个用户的兴趣 ID 都是不同的。请记住,实际上永远不必删除数据——它是一个一直在增长的集合。

mysql optimization update

4
推荐指数
1
解决办法
158
查看次数

postgreSQL 更新仅在可以强制转换的情况下设置并忽略错误?

我在 PostgreSQL 表中有 2 列。该mac_address_temp列用于从字符类型迁移到 MAC 地址类型:

mac_address      | macaddr               |
mac_address_temp | character varying(17) |
Run Code Online (Sandbox Code Playgroud)

我想将数据从 mac_address_temp 迁移到 mac_address,但有些数据无法转换为macaddr类型。

mac_address | mac_address_temp
-------------+------------------
            | AAB5:4f27:e299
            | AAB54f27e299

UPDATE mactable SET mac_address = CAST(mac_address_temp as macaddr);
ERROR:  invalid input syntax for type macaddr: "AAB5:4f27:e299"
Run Code Online (Sandbox Code Playgroud)

有没有办法忽略CAST不工作的地方并仍然更新表格的其余部分?

postgresql update

4
推荐指数
1
解决办法
4929
查看次数

更新会话表很慢

我在 Web 服务器上有许多带有会话表的网站,这些被 Joomla CMS 和 Symfony 框架系统使用。当slow_query_log=0.6 时,会话表的更新查询会定期出现在慢速日志中。

Joomla 会话表定义是

    CREATE TABLE IF NOT EXISTS `jos_session` (
      `username` varchar(150) DEFAULT '',
      `time` varchar(14) DEFAULT '',
      `session_id` varchar(200) NOT NULL DEFAULT '0',
      `guest` tinyint(4) DEFAULT '1',
      `userid` int(11) DEFAULT '0',
      `usertype` varchar(50) DEFAULT '',
      `gid` tinyint(3) unsigned NOT NULL DEFAULT '0',
      `client_id` tinyint(3) unsigned NOT NULL DEFAULT '0',
      `data` longtext,
      PRIMARY KEY (`session_id`(64)),
      KEY `whosonline` (`guest`,`usertype`),
      KEY `userid` (`userid`),
      KEY `time` (`time`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)

我试过将存储引擎更改为 InnoDB 没有效果,我试过优化表并删除所有索引,但主要是。此表中有记录有存储空间

Data …
Run Code Online (Sandbox Code Playgroud)

mysql performance update slow-log

4
推荐指数
1
解决办法
3093
查看次数

批量更新所有列

我想知道 PostgreSQL 是否有更新查询有点像他们的插入值语法。

我目前在此表单中有一组更新的数据:

INSERT INTO bought_in_control_panel(ID,PARENT_ID,BOUGHT_IN_FORM_TYPE_ID,PRIORITY,NAME,HEADING,DESCRIPTION,ICON,BOUGHT_IN_CONTROL_PANEL_FILE_ID)
VALUES(109,1,28,100,'Tooling','Tooling','Enter your Machine Tools here','tooling.png',null);
Run Code Online (Sandbox Code Playgroud)

并且我想将已有的行更新为新数据,我正在寻找类似以下内容的内容,我可以在其中更新所有行而无需重复自己:

UPDATE ON ID
bought_in_control_panel(ID,PARENT_ID,BOUGHT_IN_FORM_TYPE_ID,PRIORITY,NAME,HEADING,DESCRIPTION,ICON,BOUGHT_IN_CONTROL_PANEL_FILE_ID) 
VALUES(
        (109,1,28,100,'Tooling','Tooling','Enter your Machine Tools here','tooling.png',null), 
        (1,0,1,200,'Bought In','Bought In','','boughtin.png',null)
);
Run Code Online (Sandbox Code Playgroud)

以上将检查匹配ID值,并用新数据更新匹配。

注意:我真的希望避免手动映射所有列名。PostgreSQL 已经知道我的列,而且我已经将它们映射到数据上。为什么要以更长的格式再次这样做?

postgresql update

4
推荐指数
2
解决办法
3万
查看次数