精华内容
下载资源
问答
  • update语句
    千次阅读
    2019-08-09 10:39:59

    今天在做题的时候遇见一个这样的问题

    给定一个 salary 表,如下所示,有 m = 男性 和 f = 女性 的值。交换所有的 f 和 m 值(例如,将所有 f 值更改为 m,反之亦然)。要求只使用一个更新(Update)语句,并且没有中间的临时表。

    注意,您必只能写一个 Update 语句,请不要编写任何 Select 语句。

    例如:

    | id | name | sex | salary |
    |----|------|-----|--------|
    | 1  | A    | m   | 2500   |
    | 2  | B    | f   | 1500   |
    | 3  | C    | m   | 5500   |
    | 4  | D    | f   | 500    |
    运行你所编写的更新语句之后,将会得到以下表:

    | id | name | sex | salary |
    |----|------|-----|--------|
    | 1  | A    | f   | 2500   |
    | 2  | B    | m   | 1500   |
    | 3  | C    | f   | 5500   |
    | 4  | D    | m   | 500    |

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/swap-salary
     

    注意里说明 只能写一个UPDate  语句,然后想到了一个update的替换语句。

    update salary set sex = replace(sex,"f","n"),sex = replace(sex,"m","f"),sex = replace(sex,"n","m");
    

    UPDATE替换某个字段中的某个字符

    当我们需要将字段中的特定字符串批量修改为其他字符串时,可已使用以下操作:

    UPDATE table_name SET field=REPLACE(field, 'old-string', 'new-string') 
    [WHERE Clause]
    更多相关内容
  • update语句

    2019-08-05 01:30:15
    NULL 博文链接:https://tianshi-kco.iteye.com/blog/2062057
  • update语句是PHP+MySQL中常用的操作,判断update语句是否执行成功是其中非常重要的一个环节。本文就以实例展示了php+MySQL判断update语句是否执行成功的方法。分享给大家供大家参考之用。具体方法如下: 代码一: $...
  • 根据update语句自动生成select语句.
  • 这种只有update无法执行其他语句可以执行的其实是因为记录锁导致的,在oracle中,执行了update或者insert语句后,都会要求commit,如果不commit却强制关闭连接,oracle就会将这条提交的记录锁住。由于我的java程序...
  • 我们可以发现S_USER表中有个跟S_PERSON表关联的字段 那就是PERSON_ID 这也是我们要update的条件 找到这个关系以后我们就不难写sql了 update S_USER set account=p.account from S_PERSON p where p.id=S_USER....
  • SQL Server中的数据改动是免不了的,使用UPDATE语句就可以实现我们对数据库数据的更新修改操作,下面就让我们来了解一下UPDATE语句的用法
  • SQL UPDATE 语句

    2020-12-16 16:11:57
    SQL UPDATE 语句 UPDATE 语句用于更新表中的记录。 SQL UPDATE 语句 UPDATE 语句用于更新表中已存在的记录。 SQL UPDATE 语法 UPDATE table_name SET column1=value1,column2=value2,… WHERE some_column=some_...
  • update语句的优化-oracle

    2019-12-17 16:51:32
    update语句的优化-oracle
  • PostgreSQL UPDATE 语句

    千次阅读 2021-11-25 15:17:31
    UPDATE 语句 如果我们要更新在 highgodb 数据库中的数据,我们可以用 UPDATE 来操作。 语法 以下是 UPDATE 语句修改数据的通用 SQL 语法: UPDATE table_name SET column1 = value1, column2 = value2...., columnN ...

    UPDATE 语句

    如果我们要更新在 highgodb 数据库中的数据,我们可以用 UPDATE 来操作。

    语法

    以下是 UPDATE 语句修改数据的通用 SQL 语法:

    UPDATE table_name
    SET column1 = value1, column2 = value2...., columnN = valueN
    WHERE [condition];
    

    ● 我们可以同时更新一个或者多个字段。
    ● 我们可以在 WHERE 子句中指定任何条件。

    实例

    创建 class表,数据内容如下:

    highgo=# select * from class;
     id |   name   | age |  birthday  |  address  | tuition_fee 
    ----+----------+-----+------------+-----------+-------------
      1 | xiaoming |  18 | 2004-01-10 | jinan     |     5000.00
      2 | xiaohong |  19 | 2003-08-20 | liaocheng |     5000.00
      3 | xiaoli   |  18 | 2004-05-08 | taian     |     6000.00
      4 | xiaozhao |  19 | 2003-09-18 | jinan     |     6000.00
      5 | xiaowang |  18 | 2004-01-18 | jinan     |     6000.00
    (5 rows)
    

    以下实例将更新 class表中 id 为 3 的 tuition_fee字段值:

    highgo=# update class set tuition_fee=7000 where id = 3;
    UPDATE 1
    

    得到结果如下:

    highgo=# select * from class;
     id |   name   | age |  birthday  |  address  | tuition_fee 
    ----+----------+-----+------------+-----------+-------------
      1 | xiaoming |  18 | 2004-01-10 | jinan     |     5000.00
      2 | xiaohong |  19 | 2003-08-20 | liaocheng |     5000.00
      4 | xiaozhao |  19 | 2003-09-18 | jinan     |     6000.00
      5 | xiaowang |  18 | 2004-01-18 | jinan     |     6000.00
      3 | xiaoli   |  18 | 2004-05-08 | taian     |     7000.00
    (5 rows)
    

    从结果上看,class 表中的 id 为 3 的 tuition_fee字段值已被修改。
    以下实例将同时更新 tuition_fee字段和 address 字段的值:

    highgo=# update class set address = 'jinan' ,tuition_fee = 5000;
    UPDATE 5
    

    得到结果如下:

    highgo=# select * from class;
     id |   name   | age |  birthday  | address | tuition_fee 
    ----+----------+-----+------------+---------+-------------
      1 | xiaoming |  18 | 2004-01-10 | jinan   |     5000.00
      2 | xiaohong |  19 | 2003-08-20 | jinan   |     5000.00
      4 | xiaozhao |  19 | 2003-09-18 | jinan   |     5000.00
      5 | xiaowang |  18 | 2004-01-18 | jinan   |     5000.00
      3 | xiaoli   |  18 | 2004-05-08 | jinan   |     5000.00
    (5 rows)
    
    展开全文
  • sql update 语句_SQL Update语句概述

    万次阅读 2020-07-25 13:26:59
    sql语句update In this article, we’ll walk-through the SQL update statementto modify one or more existing rows in the table. 在本文中,我们将逐步介绍SQL更新语句,以修改表中的一个或多个现有行。 ...

    sql update 语句

    In this article, we’ll walk-through the SQL update statement to modify one or more existing rows in the table. 

    在本文中,我们将逐步介绍SQL更新语句,以修改表中的一个或多个现有行。

    In order to modify data in a table, we’ll use an Update statement, a DML (data manipulation language) statement. A SQL update statement comes with a SET clause where we define the column-and-value as a pair of items. In addition, you can enforce the conditional clause. In order to limit the number of rows, we’ll need to set up a where clause. The condition is defined in the where clause that identifies what rows to modify in the table.

    为了修改表中的数据,我们将使用Update语句,DML(数据操作语言)语句。 SQL Update语句带有SET子句,其中我们将列和值定义为一对项目。 另外,您可以强制执行条件子句。 为了限制行数,我们需要设置一个where子句。 该条件在where子句中定义,该子句标识表中要修改的行。

    After reading this article, you’ll understand the following topics covering how to use a simple SQL update statement

    阅读本文之后,您将了解以下主题,涉及如何使用简单SQL更新语句

    1. on multiple columns

      在多列上
    2. with computed value

      具有计算值
    3. with the compound operator

      与复合运算符
    4. with the defaults

      使用默认值
    5. with SQL joins

      与SQL联接
    6. with the Where clause

      带有Where子句
    7. on a remote table

      在远程表上
    8. with use Top(n) clause

      使用use Top(n)子句
    9. with CTE (Common-Table-Expression) statements

      与CTE(Common-Table-Expression)语句

    运行一个简单SQL更新语句 (Running a simple SQL update statement)

    For this example, we’ll work with Person.Person , so, let’s take a look at the data first. In this case, let’s say, hypothetically, we wanted to change the data of the ModifiedDate column for all rows of the table with the current datetimestamp value.

    对于此示例,我们将使用Person.Person ,因此,让我们首先看一下数据。 假设,在这种情况下,我们想更改具有当前datetimestamp值的表的所有行的ModifiedDate列的数据。

    Let us use the keyword UPDATE, and then the name of the table Person.Person, then use the keyword SET, and after that list the column name ModifiedDate and then the value, in this case, it’s current date timestamp.

    让我们使用关键字UPDATE,然后使用表Person.Person的名称,然后使用关键字SET,然后在此之后列出列名称ModifiedDate ,然后是值(在这种情况下为当前日期时间戳)。

    USE AdventureWorks2014;  
    GO  
    UPDATE Person.Person  
    SET ModifiedDate = GETDATE();
    

    对多列使用更新SQL语句 (Using an update SQL statement with Multiple columns)

    Here, we’ve to come up with a pair of items, one being the column name, and one being the value, separated by an equal sign. The following example updates the columns Bonus with the value 8000, CommissionPct with the value .30, and SalesQuota by NULL for all rows in the Sales.SalesPerson table.

    在这里,我们要提出一对项目,一个是列名,另一个是值,以等号分隔。 下面的示例对Sales.SalesPerson表中的所有行将Bonus列的值更新为8000,将CommissionPct列的值更新为.30,将SalesQuota列更新为NULL。

    USE AdventureWorks2014;  
    GO  
    UPDATE Sales.SalesPerson
      SET 
          Bonus = 8000, 
          CommissionPct = .10, 
          SalesQuota = NULL
    

    In this example, the above SQL update statement can be re-written using FROM clause and table alias.

    在此示例中,可以使用FROM子句和表别名来重写上述SQL更新语句。

    The following example updates rows in the table Sales.SalesPerson. The table alias is created and assigned to “S” in the FROM clause. The alias is also specified as the target object in the UPDATE clause.

    以下示例更新表Sales.SalesPerson中的行。 表别名已创建,并在FROM子句中分配给“ S”。 别名也被指定为UPDATE子句中的目标对象。

    USE AdventureWorks2014;  
    GO  
    UPDATE S
      SET 
          Bonus = 8000, 
          CommissionPct = .30, 
          SalesQuota = NULL
    FROM Sales.SalesPerson S;
    
    • Note: Executing a SQL Update statement without the where cases would actually update every record in the table.注意:执行不带where情况SQL Update语句实际上会更新表中的每个记录。

    使用带有Where子句的更新SQL语句 (Using an update SQL statement with a Where clause)

    In the following example, we only want to update one row of the Sales.SalesPerson table. In order to do that, we’ll need to use the WHERE clause. The where clause works exactly the same as they did with the SELECT statements. So, let’s add the keyword WHERE, and set a filter that specifies which record to modify. In this case, its BusinessEntityID is equal to 280. Now, we have an update SQL statement with SET, FROM and Where clause keywords.

    在下面的示例中,我们只想更新Sales.SalesPerson表的一行。 为此,我们需要使用WHERE子句。 where子句的工作原理与使用SELECT语句的工作原理完全相同。 因此,让我们添加关键字WHERE,并设置一个过滤器,该过滤器指定要修改的记录。 在这种情况下,其BusinessEntityID等于280。现在,我们有了带有SET,FROM和Where子句关键字的更新SQL语句。

    SELECT *
    FROM Sales.SalesPerson S
    WHERE BusinessEntityID = 280;
     
    USE AdventureWorks2014;  
    GO  
    UPDATE S
      SET 
          Bonus = 8000, 
          CommissionPct = .30, 
          SalesQuota = NULL
    FROM Sales.SalesPerson S
    WHERE BusinessEntityID = 280;
    

    And now, we see that the columns Bonus, ComissionPct, and SalesQuota have been changed with new values.

    现在,我们看到Bonus,ComissionPct和SalesQuota列已更改为新值。

    SELECT *
    FROM Sales.SalesPerson S
    WHERE BusinessEntityID = 280;
    

    SQL Update statement

    将SQL Update语句与顶层子句一起使用 (Using an SQL Update statement with a Top Clause)

    In the following examples, we can see that the use the TOP clause to limit the number of rows that are modified in the SQL UPDATE statement.

    在以下示例中,我们可以看到使用TOP子句来限制在SQL UPDATE语句中修改的行数。

    The following example updates the multiple columns of the matching rows in the Sales.SalesPerson table

    下面的示例更新Sales.SalesPerson表中匹配行的多个列

    USE AdventureWorks2014;  
    GO  
    UPDATE TOP (5) S
      SET 
          Bonus = 90000, 
          CommissionPct = .06, 
          SalesQuota = NULL
    FROM Sales.SalesPerson S
    

    We can see that the SQL update ran over a random selection of rows.

    我们可以看到SQL更新遍历了随机选择的行。

     
    SELECT *
    FROM Sales.SalesPerson S where  CommissionPct = .06
    

    SQL Update Statement

    • Note:
      • When the TOP clause is used with any DML operation, the SQL update operation is performed on a random selection of ‘n’ number of rows
      • You can also use the SET ROWCOUNT option, if you want to update the first set of rows without enforcing random selection using TOP keyword
    • 注意:
      • 当TOP子句与任何DML操作一起使用时,SQL更新操作将对'n'行数的随机选择执行
      • 如果要更新第一组行而不使用TOP关键字强制执行随机选择,也可以使用SET ROWCOUNT选项。

    使用CTE将更新SQL语句与最高条款一起使用 (Using an update SQL statement with a Top Clause using a CTE)

    As we all know that the SQL UPDATE statement with a TOP clause doesn’t support an ORDER BY clause but it is possible to get the sorted order of the columns using a CTE (Common Table Expression).

    众所周知,带有TOP子句SQL UPDATE语句不支持ORDER BY子句,但是可以使用CTE (公用表表达式)获取列的排序顺序。

    Let us run the same SQL update statement using a CTE

    让我们使用CTE运行相同SQL更新语句

     
    WITH CTE
         AS (SELECT TOP 5 *
             FROM Sales.SalesPerson
             ORDER BY BusinessEntityID)
         UPDATE CTE
           SET 
               Bonus = 190000, 
               CommissionPct = .07, 
               SalesQuota = NULL;
    

    The output signifies the update ran over a order collection of BusinessEntityID.

    输出表示更新已遍历BusinessEntityID的订单集合。

    SELECT *
    FROM Sales.SalesPerson where  CommissionPct = .07
    

    SQL Update Statement

    将SQL Update语句与计算值一起使用 (Using an SQL Update statement with Computed values)

    The following example uses computed value in SQL Update statement. The example increases the value of the Bonus column by 100 and ComissionPct column by 0.005 values for all rows of the BusinessEntityID equal to 288.

    下面的示例在SQL Update语句中使用计算值。 对于所有等于288的BusinessEntityID,该示例将Bonus列的值增加100,并将ComissionPct列的值增加0.005。

    USE AdventureWorks2014;  
    GO  
    UPDATE Sales.SalesPerson
      SET 
          Bonus = Bonus+100, 
          CommissionPct = CommissionPct+0.005 
    WHERE BusinessEntityID = 288;
    

    将SQL Update语句与Compound运算符一起使用 (Using an SQL Update statement with Compound operators)

    The following example uses the compound operator ‘+=’ and ‘*=’ to add 100 to the Bonus column and multiply 0.002 to CommissionPct column

    下面的示例使用复合运算符'+ ='和'* ='将100加到Bonus列中,并将0.002乘以CommissionPct列

    USE AdventureWorks2014;  
    GO  
    SELECT * FROM Sales.SalesPerson WHERE BusinessEntityID = 289;
    GO
    UPDATE Sales.SalesPerson
      SET 
          Bonus += 100, 
          CommissionPct *= 0.005 
    WHERE BusinessEntityID = 289;
    GO
    SELECT * FROM Sales.SalesPerson WHERE BusinessEntityID = 289;
    

    /wp-content/uploads/2018/10/word-image-13.png

    使用带有默认值SQL Update语句 (Using an SQL Update statement with a default values)

    The following example sets the Primary column to its default value ((0)) for all rows that have a value equal to 1

    下面的示例将值等于1的所有行的Primary列设置为其默认值((0))

    USE AdventureWorks2014;  
    GO  
    UPDATE Production.ProductProductPhoto  
    SET [Primary] = DEFAULT  
    WHERE [Primary]=1
    
    • Note: You can find the default definition of the column using the following T-SQL.注意:您可以使用以下T-SQL查找列的默认定义。
    SELECT name,object_name(object_id),object_definition(default_object_id) Default_Definition
    FROM   sys.columns
    WHERE  name      ='Primary'
    AND    object_id = object_id('Production.ProductProductPhoto')
    

    /wp-content/uploads/2018/10/word-image-14.png

    将SQL Update语句与SQL连接一起使用 (Using an SQL Update statement with a SQL Joins)

    This example modifies the Rate column of the entire rows employee where they belong to the ‘Research and Development’ group.

    本示例修改了属于“研究与开发”组的整个行员工的“费率”列。

    UPDATE EPH
      SET 
          EPH.Rate*=2
    FROM HumanResources.EmployeePayHistory EPH
         INNER JOIN HumanResources.Employee EMP ON EMP.BusinessEntityID = EPH.BusinessEntityID
         INNER JOIN HumanResources.EmployeeDepartmentHistory H ON EMP.BusinessEntityID = H.BusinessEntityID
         INNER JOIN HumanResources.Department Dept ON H.DepartmentID = Dept.DepartmentID
    WHERE Dept.GroupName = 'Research and Development';
    
    • Note: If you’re writing an UPDATE statement and you want to know how many rows might affect, You just need to place SELECT  * FROM, keeping the same WHERE clause, and this will figure out how many rows that going to actually change.注意:如果您正在编写UPDATE语句,并且想知道可能影响多少行,则只需放置SELECT * FROM,并保持相同的WHERE子句,这将找出实际更改的行数。
    SELECT EMP.JobTitle, 
           EPH.Rate * 2
    FROM HumanResources.EmployeePayHistory EPH
         INNER JOIN HumanResources.Employee EMP ON EMP.BusinessEntityID = EPH.BusinessEntityID
         INNER JOIN HumanResources.EmployeeDepartmentHistory H ON EMP.BusinessEntityID = H.BusinessEntityID
         INNER JOIN HumanResources.Department Dept ON H.DepartmentID = Dept.DepartmentID
    WHERE Dept.GroupName = 'Research and Development';
    

    /wp-content/uploads/2018/10/word-image-15.png

    使用链接服务器和OPENQUERY的远程表 (Remote tables using a linked server and OPENQUERY)

    The following example uses the linked server to update a data on a remote server.

    以下示例使用链接的服务器更新远程服务器上的数据。

    UPDATE HQDBT01.AdventureWorks2014.HumanResources.Department  
    SET GroupName = N'CIS Relations'  
    WHERE DepartmentID = 4;
     
     
    SELECT GroupName FROM HQDBT01.AdventureWorks2014.HumanResources.Department WHERE DepartmentID = 4
    

    /wp-content/uploads/2018/10/word-image-16.png

    In the following example, rows on the remote table is updated using the OPENQUERY rowset function

    在以下示例中,使用OPENQUERY行集功能更新远程表上的行

    UPDATE OPENQUERY(HQDBT01, 'SELECT GroupName FROM AdventureWorks2014.HumanResources.Department WHERE DepartmentID = 4')
      SET 
          GroupName = 'Sales and Marketing';
    

    摘要 (Summary)

    Thus far, we’ve discussed some of simple methods of updating rows using a SQL Update statement in SQL Server and various permutations using conditions, clauses and in other contexts. I hope you enjoyed reading this article and for any questions, please feel to comment below…

    到目前为止,我们已经讨论了在SQL Server中使用SQL Update语句更新行的一些简单方法,以及在使用条件,子句和其他上下文的情况下进行的各种排列。 希望您喜欢阅读本文,如有任何疑问,请在下面发表评论……

    翻译自: https://www.sqlshack.com/overview-of-the-sql-update-statement/

    sql update 语句

    展开全文
  • 生成UPDATE语句

    2012-11-22 17:42:23
    根据表结构生成打印出根据主键update语句
  • SQL语句中的更新语句update是最常用的语句之一,言外之意,就是对数据进行修改。在标准的SQL中有3个语句,它们是INSERT、UPDATE以及DELETE。 用于操作数据库的SQL一般分为两种,一种是查询语句,也就是我们所说的...
  • 首先,单表的UPDATE语句: UPDATE [LOW_PRIORITY] [IGNORE] tbl_name SET col_name1=expr1 [, col_name2=expr2 …] [WHERE where_definition] [ORDER BY …] [LIMIT row_count] 其次,多表的UPDATE语句:   UPDATE ...
  • MySQL数据库中group by语句与update语句的用法研究.pdf
  • MySQL中:一条update语句是怎样执行的

    千次阅读 多人点赞 2022-03-10 21:04:35
    上一篇文章说完MySQL的事务和锁了,这次来详细介绍一下在MySQL中一条更新语句的详细执行流程 (本文无特殊说明均是采用Innodb存储引擎)。 前期准备 首先创建一张表,然后插入三条数据: CREATE TABLE T( ID int(11) ...

    🥂上一篇文章说完MySQL的事务和锁了,这次来详细介绍一下在MySQL中一条更新语句的详细执行流程 (本文无特殊说明均是采用Innodb存储引擎)。

    前期准备

    ⭐⭐首先创建一张表,然后插入三条数据:

    CREATE TABLE T(
    	ID int(11) NOT NULL AUTO_INCREMENT,
    	c int(11) NOT NULL,
    	PRIMARY KEY (ID)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='测试表';
    
    INSERT INTO T(c) VALUES (1), (2), (3);
    

    让后执行更新操作:

    update T set c=c+1 where ID=2;
    

    在说更新操作前,大家先来看一下sql语句在MySQL中的执行流程~

    🍬SQL语句的执行过程

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oRuDIrVS-1646917447700)(/upload/2021/10/image-3b172ec1cf324d3ea025e518547a668a.png)]

    👩🏻‍🏫如图所示:MySQL数据库主要分为两个层级:服务层存储引擎层服务层:server层包括连接器、查询缓存、分析器、优化器、执行器,包括大多数MySQL中的核心功能所有跨存储引擎的功能也在这一层实现,包括 存储过程、触发器、视图等。 存储引擎层:存储引擎层包括MySQL常见的存储引擎,包括MyISAM、InnoDB和Memory等,最常用的是InnoDB,也是现在MySQL的默认存储引擎。

    server层中的组件介绍✨✨✨

    1. 连接器: 需要MySQL客户端登录,需要一个 连接器 来连接用户和MySQL数据库,“mysql -u 用户名 -p 密码” 进行MySQL登录,在完成 TCP握手 后,连接器会根据输入的用户名和密码验证登录身份。
    2. 查询缓存: MySQL在得到一个执行请求后,会首先去 查询缓存 中查找,是否执行过这条SQL语句,之前执行过得语句以及结果会以 key-value对的形式,放在内存中。key是查询语句,value是查询的结果。如果通过key能够查找到这条SQL语句,直接返回SQL的执行结果。若不存在缓存中,就会继续后面的执行阶段。执行完成后,执行结果就会被放入查询缓存中。优点是效率高。但是查询缓存不建议使用, 因为在MySQL中对某张表进行了更新操作,那么所有的查询缓存就会失效,对于更新频繁的数据库来说,查询缓存的命中率很低。需要注意:在MySQL8.0版本,查询缓存功能就删除了,不存在查询缓存的功能了
    3. 分析器: 分为词法分析和语法分析
      • 词法分析: 首先,MySQL会根据SQL语句进行解析,分析器会先做 词法分析,你写的SQL就是由多个字符串和空格组成的一条SQL语句,MySQL需要识别出里面的字符串是什么,代表什么。
      • 语法分析: 然后进行 语法分析, 根据词法分析的结果,语法分析器会根据语法规则,判断输入的这个SQL语句是否满足MySQL语法。如果SQL语句不正确,就提示:You have an error in your SQL suntax
    4. 优化器: 经过分析器分析后,SQL就合法了,但在执行之前,还需要进行优化器的处理,优化器会判断使用了哪种索引,使用哪种连接,优化器的作用 就是确定效率最高的执行方案。
    5. 执行器: 在执行阶段,MySQL首先会判断有没有执行语句的权限,若无权限,返回没有权限的错误;若有权限,就打开表继续执行。打开表时,执行器会根据标的引擎定义,去使用该引擎提供的接口,对于有索引的表,执行的逻辑类似。

    了解完SQL语句的执行流程我们接下来详细分析一下上面update T set c=c+1 where ID=2;是如何执行的。

    🏅Update语句分析

    update T set c=c+1 where ID=2;
    

    在执行update更新操作的时候,跟这个表有关的查询缓存会失效,所以这条语句就会把表 T 上所有缓存结果都清空。接下来,分析器会经过语法分析和词法分析,知道了这是一条更新语句后,优化器决定要使用哪一个索引,然后执行器负责具体的执行,先找到这一行,然后做更新。

    按照我们平常的思路,就是 找出这条记录,把它的值改好,保存就OK了 。但我们追究一下细节,由于涉及到修改数据,所以涉及到日志了。更新操作涉及到两个重要的日志模块。redo log(重做日志)bin log(归档日志)。MySQL中的这两个日志也是必学的。

    redo log(重做日志)🍦

    • 在 MySQL 里,如果每一次的更新操作都需要写进磁盘,然后磁盘也要找到对应的那条记录,然后再更新,整个过程 IO 成本、查找成本都很高。
      MySQL里使用WAL(预写式日志)技术,WAL 的全称是 Write-Ahead Logging,它的关键点就是 先写日志,再写磁盘
    • 具体来说,当有一条记录需要更新的时候,InnoDB 引擎就会先把记录写到 redo log里面,并更新内存,这个时候更新就算完成了。同时,InnoDB 引擎会在适当的时候,将这个操作记录更新到磁盘里面,而这个更新往往是在系统比较空闲的时候做。
    • InnoDB 的 redo log 是固定大小的,比如可以配置为一组 4 个文件,每个文件的大小是 1GB,那么总共就可以记录 4GB 的操作。从头开始写,写到末尾就又回到开头循环写。

    听完上面对redo log日志的介绍后,小伙伴们可能会问:redo log日志存储在哪?数据库信息保存在磁盘上,redo log日志也保存在磁盘上,为什么要先写到redo log中再写到数据库中呢?redo log日志如果存满数据了怎么办?等等。接下来就解答一下这些疑问。

    redo log存储在哪里?🍦

    InnoDB引擎先把记录写到redo log 中,redo log 在哪,它也是在磁盘上,这也是一个写磁盘的过程, 但是与更新过程不一样的是,更新过程是在磁盘上随机IO,费时。 而写redo log 是在磁盘上顺序IO。效率要高。

    redo log 空间是固定,那它会不会用完呢?🍹

    首先不用担心 redo log 会用完空间,因为它是循环利用的。例如 redo log 日志配置为一组4个文件,每个文件分别为1G。它写的流程如下图:
    在这里插入图片描述

    简单总结一下: redo log日志是Innodb存储引擎特有的机制,可以用来应对异常恢复Crash-safe,redo可以保证mysql异常重启时,将未提交的事务回滚,已提交的事务安全落库。

    crash-safe: 有了 redo log,InnoDB 就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为crash-safe。

    binlog(归档日志)🙇🏻‍♀️

    redo log是innoDB 引擎特有的日志。而binlog是mysql server层的日志。

    其实bin log日志出现的时间比redo log早,因为最开始MySQL是没有InnoDB存储引擎的,5.5之前是MyISAM。但是 MyISAM 没有 crash-safe 的能力,binlog 日志只能用于归档。而 InnoDB 是另一个公司以插件形式引入 MySQL 的,既然只依靠 binlog 是没有 crash-safe 能力的,所以 InnoDB 使用另外一套日志系统——也就是 redo log 来实现 crash-safe 能力。

    redo logbin log的总结📍:

    • redo log是为了保证innoDB引擎的crash-safe能力,也就是说在mysql异常宕机重启的时候,之前提交的事务可以保证不丢失;(因为成功提交的事务肯定是写入了redo log,可以从redo log恢复)
    • bin log是归档日志,将每个更新操作都追加到日志中。这样当需要将日志恢复到某个时间点的时候,就可以根据全量备份+bin log重放实现。 如果没有开启binlog,那么数据只能恢复到全量备份的时间点,而不能恢复到任意时间点。如果连全量备份也没做,mysql宕机,磁盘也坏了,那就很尴尬了。。

    redo logbin log的区别📍:

    • redo log 是 InnoDB 引擎特有的;bin log 是 MySQL 的 Server 层实现的,所有引擎都可以使用。
    • redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;bin log 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=2 这一行的 c 字段加 1 ”。
    • redo log 是循环写的,空间固定会用完;binlog 是可以追加写入的。“追加写”是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。

    👀InnoDB引擎部分在执行这个简单的update语句的时候的内部流程

    update T set c=c+1 where ID=2;
    

    在这里插入图片描述

    🍋手动用begin开启事务,然后执行update语句,再然后执行commit语句,那上面的update更新流程之前 哪些是update语句执行之后做的,哪些是commit语句执行之后做的?

    事实上,redo log在内存中有一个redo log buffer,binlog 也有一个binlog cache.所以在手动开启的事务中,你执行sql语句,其实是写到redo log bufferbinlog cache中去的(肯定不可能是直接写磁盘日志,一个是性能差一个是回滚的时候不可能去回滚磁盘日志吧),然后当你执行commit的时候,首先要将redo log的提交状态游prepare改为commit状态,然后就要把binlog cache刷新到binlog日志(可能也只是flush到操作系统的page cache,这个就看你的mysql配置),redo log buffer刷新到redo log 日志(刷新时机也是可以配置的)。 如果你回滚的话,就只用把binlog cacheredo log buffer中的数据清除就行了。

    🎈在update过程中,mysql突然宕机,会发生什么情况?

    1. 如果redolog写入了,处于prepare状态,binlog还没写入,那么宕机重启后,redolog中的这个事务就直接回滚了。
    2. 如果redolog写入了,binlog也写入了,但redolog还没有更新为commit状态,那么宕机重启以后,mysql会去检查对应事务在binlog中是否完整。如果是,就提交事务;如果不是,就回滚事务。 (redolog处于prepare状态,binlog完整启动时就提交事务,为啥要这么设计? 主要是因为binlog写入了,那么就会被从库或者用这个binlog恢复出来的库使用,为了数据一致性就采用了这个策略)
      redo log和binlog是通过xid这个字段关联起来的。
      在这里插入图片描述
    展开全文
  • update语句详解

    万次阅读 2021-10-05 13:47:17
    update命令 语法: UPDATE表名SETcolumn_name=value [,column_name2=value2,...] [WHEREcondition]; 或者理解为:UPDATE 表名 SET 列名=VALUE WHERE [条件] 注意 : column_name 为要更改的数据列,尽量带上...
  • MySQL UPDATE语句介绍

    千次阅读 2021-01-18 22:58:58
    UPDATE语句修改表中的现有数据。UPDATE可以修改单行或多行的一或多个列中的数据。UPDATE语句的基本语法:UPDATE [LOW_PRIORITY] [IGNORE] table_nameSETcolumn_name1 = expr1,column_name2 = expr2,...[WHERE...
  • 今天我们主要向大家讲述的是MySQL update 语句的实际用法,以及在实际操作中哪些相关的操作步骤是值得我们大家注意的。
  • MySQL——update 语句执行流程

    千次阅读 2022-02-10 09:38:09
    图1 update语句执行流程 从 Buffer Pool(内存中) 中查看是否有这条数据,没有就从磁盘中加载到缓冲池,然后对这行记录加独占锁; 把更新行记录的旧值写入 undo log(以便回滚); 更新 Buffer Pool 中的数据(成脏...
  • postgreSQL的update语句

    千次阅读 2022-01-06 11:53:46
    postgreSQL的update语句 这里作者用的是DBeaver新建一个SQL语句进行示范: 首先申明下,由于当我们查询一个语句时候,输入表名后,查询语句后边会有一个表名的缩写: 所以在下边,我们之后一般用到的条件语句,都是...
  • mysql update语句锁行还是锁表?

    千次阅读 2022-05-25 15:01:12
    mysql update语句锁行还是锁表?
  • MySQL update 语句的正确用法

    千次阅读 2021-02-06 16:09:32
    以下的文章主要介绍的MySQLupdate 语句的实际用法,我们首先是以单表的UPDATE语句来引出实现MySQL update 语句的实际方案,以下就是文章的详细内容描述,望你看完之后会有收获。单表的MySQL UPDATE语句:UPDATE[LOW_...
  • MySQL对数据的基本操作三:UPDATE语句

    千次阅读 2021-04-05 22:19:39
    一:UPDATE语句简介 二:案例:不涉及表连接 的案例(这部分不难) 三:案例:涉及表连接 一:UPDATE语句简介 ●UPDATE子句,选择要修改的表;UPDATE子句只执行一次; ●IGNORE关键字可写可不写,作用是在写入...
  • 对MySQL中的表进行批量update的时候,如果每个记录用一个update语句,5000条记录的话,大概需要30秒钟。下面采用的case when方法可以把5000条update拼成一条:Update myTableSET myField = CASE idWHEN 1 THEN '...
  • Oracle Update语句的几种方式

    万次阅读 2021-09-02 19:22:36
    一、标准update语法(常用、速度可能最慢) 当更新的表示单个或者被更新的字段不需要关联表带过来,此法是最好的选择。 update a set a.c2= (select b.c2from b where a.c1=b.c1) where exists (select 1 from...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 787,316
精华内容 314,926
关键字:

update语句