标签: update

INSERT 不适用于 NOT NULL 但 UPDATE 可以,为什么?

我有这个表定义:

CREATE TABLE `media` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `brands_id` int(11) DEFAULT NULL,
  `media_type` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
  `title` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
  `description` longtext COLLATE utf8_unicode_ci NOT NULL,
  `thumbnail_url` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `media_url` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `media_code` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
  `inactive` tinyint(1) NOT NULL,
  `createdAt` datetime NOT NULL,
  `updatedAt` datetime NOT NULL,
  `titleHtml` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
  `descriptionHtml` longtext COLLATE utf8_unicode_ci NOT NULL,
  `useHtml` tinyint(1) NOT NULL,
  PRIMARY KEY …
Run Code Online (Sandbox Code Playgroud)

mariadb null insert update

2
推荐指数
1
解决办法
1485
查看次数

仅当另一个表中的 COUNT 不为零时才更新

我通过计算另一个表中的 FK 来更新一个表

UPDATE table1 
SET number = number +
(
SELECT COUNT(*) FROM table2 
WHERE  table1.id=table2.id
)
Run Code Online (Sandbox Code Playgroud)

table1是一张大桌子,我想制作UPDATE唯一的如果COUNT找到了一些东西。换句话说,我不想制作UPDATEfor number=0

mysql count update

2
推荐指数
1
解决办法
2562
查看次数

Percona 5.7 tokudb 查询性能不佳 - 选择了错误的(非聚集)索引

我有一个大约有 8.5m 行的表格。该表是 tokudb,它具有下面描述的索引。在尝试运行如下更新语句时,我遇到了令人沮丧的性能:

 update retail.lw_item_discovery 
 set price = 'X', 
     prev_price = 'Y', 
     last_updated = '2016-04-13', 
     last_price_change = '2016-04-13' 
 where market = 'XX' 
   and sku = '123456'
Run Code Online (Sandbox Code Playgroud)

执行此更新需要 40 秒以上的时间。还有其他类似的更新经常发生,但是这台机器的 I/O 子系统并没有受到丝毫压力(RAID SSD),并且还有大量可用的 RAM。

EXPLAIN 产量:

 update retail.lw_item_discovery 
 set price = 'X', 
     prev_price = 'Y', 
     last_updated = '2016-04-13', 
     last_price_change = '2016-04-13' 
 where market = 'XX' 
   and sku = '123456'
Run Code Online (Sandbox Code Playgroud)

基于此 - 它选择PRIMARY索引而不是其他索引之一,例如cl_unique_idx在前两个位置的 where 语句中具有两列的索引。所以我很难过为什么计划者选择了PRIMARY而不是导致性能如此糟糕。以下是索引列表:

+----+-------------+-------------------+------------+-------+------------------------------------------------------------+---------+---------+------+------+----------+------------------------------+
| id | select_type | table             | partitions | …
Run Code Online (Sandbox Code Playgroud)

mysql locking percona-server update tokudb

2
推荐指数
1
解决办法
1300
查看次数

在 PostgreSQL 中使用 JSONB 从数组中删除对象

我试图从我的数据库中删除一个元素。我要删除的元素位于一个名为 playerContainer 的 JSON 对象中,该对象包含一个名为玩家的数组。这一切都位于一个名为 site_content 的表中。我正在尝试根据它的 ID 删除该对象。

这是示例 JSON

"playersContainer": {
        "players": [
            {
                "id": "1",
                "name": "Nick",
                "teamName": "Shire Soldiers",
                "ratings": [
                    1,
                    5,
                    6,
                    9
                ],
                "assists": 17,
                "manOfTheMatches": 20,
                "cleanSheets": 1,
                "data": [
                    3,
                    2,
                    3,
                    5,
                    6
                ],
                "totalGoals": 19

            },
}
Run Code Online (Sandbox Code Playgroud)

下面是我试图用来删除数组中的对象的查询

UPDATE site_content
SET content = jsonb_set(content, '{playersContainer,players}'::text[], content->'playersContainer'->'id'->'players' #- '{1}'::jsonb
Run Code Online (Sandbox Code Playgroud)

但是,这似乎删除了表中内容行中的所有数据,而不仅仅是我的玩家数组中 ID 为 1 的数组。

postgresql delete update json

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

即使行没有更改,INSERT INTO ... ON DUPLICATE KEY UPDATE 也会执行吗?

让我解释 :

让我们假设我们有一个数据库“用户”:

ID   Name   Surname
===================
1    John   Doe
2    Foo    Bar
3    Foo    Baz
Run Code Online (Sandbox Code Playgroud)

现在我想更改所有这三行。我将抛出以下插入:

INSERT INTO user (ID, Name, Surname) VALUES (1, 'John', 'Conor') ON DUPLICATE KEY UPDATE ID = 1, Name = 'John', Surname = 'Conor';
INSERT INTO user (ID, Name, Surname) VALUES (2, 'Foo', 'Bar') ON DUPLICATE KEY UPDATE ID = 2, Name = 'Foo', Surname = 'Bar';
INSERT INTO user (ID, Name, Surname) VALUES (3, 'Foo', 'Baz') ON DUPLICATE KEY UPDATE ID = 3, …
Run Code Online (Sandbox Code Playgroud)

mysql insert duplication update

2
推荐指数
1
解决办法
2087
查看次数

T-SQL 的 RowNum(不是 TOP #)

试图运行更新,但我想逐步完成它,因为它有相当多的数据并且不想一次全部爆炸。

在 oracle 中,选择我想要的行要容易一些,因为您可以将它包含在WHERE子句中,但在 T-SQL 中您将它包含在select. 我想写一些类似的东西:

Update Instances
set thing = 'new thing'
Where rownum<500
Run Code Online (Sandbox Code Playgroud)

基本上想一次做500个,这个语法在TSQL中可行吗?

sql-server t-sql update

2
推荐指数
2
解决办法
559
查看次数

将 SQL Server 2016 从 RTM 更新到 SP1

我安装了 SQL Server 2016 RTM 并希望将其更新到 SP1。当我运行 SP1 累积更新时,它失败了,因为没有要更新的内容。大概这是因为它需要先安装 SP1。当我运行 SP1 安装程序时,它想创建一个新实例。

如何将现有实例从 RTM 更新到 SP1,而无需卸载和重新安装实例?

update sql-server-2016

2
推荐指数
1
解决办法
3050
查看次数

就地更新导致转发记录

我很清楚堆中的转发记录是什么。由于我想将转发记录保留为 0,因此我们决定仅更新无法扩展的列。

最近在我的系统上我遇到了转发记录。
表设计是这样的:

CREATE TABLE dbo.test (
 HashValue BINARY(16) NOT NULL,
 LoadTime DATETIME NOT NULL,
 LoadEndTime DATETIME NULL,
[other columns that never get updates]
) WITH(DATA_COMPRESSION=PAGE);
Run Code Online (Sandbox Code Playgroud)

插入语句总是带来HashValueAND LoadTime。我检查了查询日志。
我插入一个值 '9999-12-31'。

现在系统执行更新LoadTime如下:

;WITH CTE AS (
SELECT *, COALESCE(LEAD(LoadTime) OVER(PARTITION BY HashValue ORDER BY LoadTime) ,'9999-12-31') as EndTimeStamp
)
UPDATE CTE SET LoadEndTime = EndTimeStamp;
Run Code Online (Sandbox Code Playgroud)

由于该LoadEndTime列始终被填充,因此在执行更新时,该行内不应有该列的扩展。它应该是一个就地更新。在那个过程之后我仍然总是得到转发的记录......这对我来说没有意义。

插入语句是这样的:

INSERT INTO dbo.test (HashValue, LoadTime,LoadEndTime)
SELECT HASHBYTES(...), GETDATE(), '1900-01-01'
Run Code Online (Sandbox Code Playgroud)

所以已经有一个虚拟值。即使使用压缩,日期时间 '1900-01-01 00:00:00' 的固定和可变表示应该是 8 个字节。

sql-server heap update

2
推荐指数
1
解决办法
80
查看次数

Postgres 在 Update 语句中将语法错误评估为布尔值

最近我在代码中遇到了一个错误,相当于这个片段:

create table testing(num int, dt date, istrue boolean);

insert into testing values (1, '2018-01-01', True);

UPDATE testing SET num = 2, istrue = null AND dt = '2018-01-01';
Run Code Online (Sandbox Code Playgroud)

UPDATE 语句实际上应该是:

UPDATE testing SET num = 2, istrue = null WHERE dt = '2018-01-01';
Run Code Online (Sandbox Code Playgroud)

然而 postgresql 很高兴地接受了 UPDATE 为有效并评估了代码:

null AND dt = '2018-01-01'
Run Code Online (Sandbox Code Playgroud)

在第二个等号作为布尔值之后,因此基于错误的逻辑更新了数据。

我已经在其他 SQL 风格中尝试过这个,但这是不允许的,他们想要一个 WHERE。

我不是 postgres 的人,但它看起来确实是一个非常奇怪的语法怪癖,还是一个错误?

postgresql update

2
推荐指数
1
解决办法
1580
查看次数

哪个更新数千个表行更快?

使用PostgreSQL v10.1.2 中的存储过程,哪种方法最快或哪种更好:检查行是否存在然后更新或尝试直接更新,但可能找不到与条件匹配的行?我需要检查很多条件相同的表,表是不是“非规范化”,我进行了几次测试,有时选项 1在其他情况下更快,选项 2 ...

选项1:

IF EXISTS ( SELECT  1
FROM   public.table1 
WHERE  column1 = 'oldvalue' )
THEN
   UPDATE public.table1
   SET   column1 = 'newvalue' , date_update= .... 
   WHERE  column1 = 'oldvalue';
END IF ;
Run Code Online (Sandbox Code Playgroud)

选项 2:

UPDATE public.table1
SET   column1 = 'newvalue' , date_update= ... 
WHERE  column1 = 'oldvalue';
Run Code Online (Sandbox Code Playgroud)

选项 3:

perform FROM   public.table1 WHERE  column1 = 'oldvalue' ;
if found then 
   UPDATE public.table1 SET column1='newvalue', date_update = ... WHERE column1 …
Run Code Online (Sandbox Code Playgroud)

postgresql performance stored-procedures update postgresql-10

2
推荐指数
1
解决办法
3900
查看次数