首页数据库update语句执行顺序,数据库查询语句执行顺序

update语句执行顺序,数据库查询语句执行顺序

编程之家2026-05-231129次浏览

各位老铁们好,相信很多人对update语句执行顺序都不是特别的了解,因此呢,今天就来为大家分享下关于update语句执行顺序以及数据库查询语句执行顺序的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!

update语句执行顺序,数据库查询语句执行顺序

SQL里面update 的用法

UPDATE

更改表中的现有数据。

语法

UPDATE

{

table_name WITH(< table_hint_limited> [...n ])

update语句执行顺序,数据库查询语句执行顺序

| view_name

| rowset_function_limited

}

SET

{ column_name={ expression| DEFAULT| NULL}

|@variable= expression

update语句执行顺序,数据库查询语句执行顺序

|@variable= column= expression} [,...n ]

{{ [ FROM{< table_source>} [,...n ] ]

[ WHERE

< search_condition> ]}

|

[ WHERE CURRENT OF

{{ [ GLOBAL ] cursor_name}| cursor_variable_name}

]}

[ OPTION(< query_hint> [,...n ]) ]

< table_source>::=

table_name [ [ AS ] table_alias ] [ WITH(< table_hint> [,...n ]) ]

| view_name [ [ AS ] table_alias ]

| rowset_function [ [ AS ] table_alias ]

| derived_table [ AS ] table_alias [( column_alias [,...n ]) ]

|< joined_table>

< joined_table>::=

< table_source>< join_type>< table_source> ON< search_condition>

|< table_source> CROSS JOIN< table_source>

|< joined_table>

< join_type>::=

[ INNER|{{ LEFT| RIGHT| FULL} [OUTER]} ]

[< join_hint> ]

JOIN

< table_hint_limited>::=

{ FASTFIRSTROW

| HOLDLOCK

| PAGLOCK

| READCOMMITTED

| REPEATABLEREAD

| ROWLOCK

| SERIALIZABLE

| TABLOCK

| TABLOCKX

| UPDLOCK

}

< table_hint>::=

{ INDEX( index_val [,...n ])

| FASTFIRSTROW

| HOLDLOCK

| NOLOCK

| PAGLOCK

| READCOMMITTED

| READPAST

| READUNCOMMITTED

| REPEATABLEREAD

| ROWLOCK

| SERIALIZABLE

| TABLOCK

| TABLOCKX

| UPDLOCK

}

< query_hint>::=

{{ HASH| ORDER} GROUP

|{ CONCAT| HASH| MERGE} UNION

|{LOOP| MERGE| HASH} JOIN

| FAST number_rows

| FORCE ORDER

| MAXDOP

| ROBUST PLAN

| KEEP PLAN

}

参数

table_name

需要更新的表的名称。如果该表不在当前服务器或数据库中,或不为当前用户所有,这个名称可用链接服务器、数据库和所有者名称来限定。

WITH(< table_hint_limited> [...n ])

指定目标表所允许的一个或多个表提示。需要有 WITH关键字和圆括号。不允许有 READPAST、NOLOCK和 READUNCOMMITTED。有关表提示的信息,请参见 FROM。

view_name

要更新的视图的名称。通过 view_name来引用的视图必须是可更新的。用 UPDATE语句进行的修改,至多只能影响视图的 FROM子句所引用的基表中的一个。有关可更新视图的更多信息,请参见 CREATE VIEW。

rowset_function_limited

OPENQUERY或 OPENROWSET函数,视提供程序功能而定。有关提供程序所需功能的更多信息,请参见 OLE DB提供程序的 UPDATE和 DELETE语句要求。有关行集函数的更多信息,请参见 OPENQUERY和 OPENROWSET。

SET

指定要更新的列或变量名称的列表。

column_name

含有要更改数据的列的名称。column_name必须驻留于 UPDATE子句中所指定的表或视图中。标识列不能进行更新。

如果指定了限定的列名称,限定符必须同 UPDATE子句中的表或视图的名称相匹配。例如,下面的内容有效:

UPDATE authors

SET authors.au_fname='Annie'

WHERE au_fname='Anne'

FROM子句中指定的表的别名不能作为 SET column_name子句中的限定符使用。例如,下面的内容无效:

UPDATE titles

SET t.ytd_sales= t.ytd_sales+ s.qty

FROM titles t, sales s

WHERE t.title_id= s.title_id

AND s.ord_date=(SELECT MAX(sales.ord_date) FROM sales)

若要使上例合法,请从列名中删除别名 t。

UPDATE titles

SET ytd_sales= t.ytd_sales+ s.qty

FROM titles t, sales s

WHERE t.title_id= s.title_id

AND s.ord_date=(SELECT MAX(sales.ord_date) FROM sales)

expression

变量、字面值、表达式或加上括弧的返回单个值的 subSELECT语句。expression返回的值将替换 column_name或@variable中的现有值。

DEFAULT

指定使用对列定义的默认值替换列中的现有值。如果该列没有默认值并且定义为允许空值,这也可用来将列更改为 NULL。

@variable

已声明的变量,该变量将设置为 expression所返回的值。

SET@variable= column= expression将变量设置为与列相同的值。这与 SET@variable= column, column= expression不同,后者将变量设置为列更新前的值。

FROM< table_source>

指定用表来为更新操作提供准则。有关更多信息,请参见 FROM。

table_name [[AS] table_alias ]

为更新操作提供准则的表的名称。

如果所更新表与 FROM子句中的表相同,并且在 FROM子句中对该表只有一个引用,则指定或不指定 table_alias均可。如果所更新表在 FROM子句中出现了不止一次,则对该表的一个(且仅仅一个)引用不能指定表的别名。FROM子句中对该表的所有其它引用都必须包含表的别名。

view_name [ [ AS ] table_alias ]

为更新操作提供准则的视图的名称。带 INSTEAD OF UPDATE触发器的视图不能是含有 FROM子句的 UPDATE的目标。

WITH(< table_hint> [...n ])

为源表指定一个或多个表提示。有关表提示的信息,请参见本卷的"FROM"。

rowset_function [ [AS] table_alias ]

任意行集函数的名称和可选别名。有关行集函数列表的信息,请参见行集函数。

derived_table

是从数据库中检索行的子查询。derived_table用作对外部查询的输入。

column_alias

替换结果集内列名的可选别名。在选择列表中放入每个列的一个别名,并将整个列别名列表用圆括号括起来。

<joined_table>

由两个或更多表的积组成的结果集,例如:

SELECT*

FROM tab1 LEFT OUTER JOIN tab2 ON tab1.c3= tab2.c3

RIGHT OUTER JOIN tab3 LEFT OUTER JOIN tab4

ON tab3.c1= tab4.c1

ON tab2.c3= tab4.c3

对于多个 CROSS联接,请使用圆括号来更改联接的自然顺序。

<join_type>

指定联接操作的类型。

INNER

指定返回所有相匹配的行对。废弃两个表中不匹配的行。如果未指定联接类型,则这是默认设置。

LEFT [OUTER]

指定除所有由内联接返回的行外,所有来自左表的不符合指定条件的行也包含在结果集内。来自左表的输出列设置为 NULL。

RIGHT [OUTER]

指定除所有由内联接返回的行外,所有来自右表的不符合指定条件的行也包含在结果集内。来自右表的输出列设置为 NULL。

FULL [OUTER]

如果来自左表或右表的某行与选择准则不匹配,则指定在结果集内包含该行,并且将与另一个表对应的输出列设置为 NULL。除此之外,结果集中还包含通常由内联接返回的所有行。

<join_hint>

指定联接提示或执行算法。如果指定了<join_hint>,也必须明确指定 INNER、LEFT、RIGHT或 FULL。有关联接提示的更多信息,请参见 FROM。

JOIN

表示联接所指定的表或视图。

ON<search_condition>

指定联接所基于的条件。尽管经常使用列和比较运算符,但此条件可指定任何谓词,例如:

FROM Suppliers JOIN Products

ON(Suppliers.SupplierID= Products.SupplierID)

当条件指定列时,列不一定必须具有相同的名称或数据类型;但是,如果数据类型不一致,则这些列要么必须相互兼容,要么是 Microsoft® SQL Server™能够隐性转换的类型。如果数据类型不能隐式转换,则条件必须使用 CAST函数显式转换数据类型。

有关搜索条件和谓词的更多信息,请参见搜索条件。

CROSS JOIN

指定两个表的矢量积。返回同样的行,就像要联接的表只列于 FROM子句中,并且未指定 WHERE子句。

WHERE

指定条件来限定所更新的行。根据所使用的 WHERE子句的形式,有两种更新形式:

搜索更新指定搜索条件来限定要删除的行。

定位更新使用 CURRENT OF子句指定游标。更新操作发生在游标的当前位置。

<search_condition>

为要更新行指定需满足的条件。搜索条件也可以是联接所基于的条件。对搜索条件中可以包含的谓词数量没有限制。有关谓词和搜索条件的更多信息,请参见搜索条件。

CURRENT OF

指定更新在指定游标的当前位置进行。

GLOBAL

指定 cursor_name指的是全局游标。

cursor_name

要从中进行提取的开放游标的名称。如果同时存在名为 cursor_name的全局游标和局部游标,则在指定了 GLOBAL时,cursor_name指的是全局游标。如果未指定 GLOBAL,则 cursor_name指局部游标。游标必须允许更新。

cursor_variable_name

游标变量的名称。cursor_variable_name必须引用允许更新的游标。

OPTION(< query_hint> [,...n ])

指定优化程序提示用于自定义 SQL Server的语句处理。

{ HASH| ORDER} GROUP

指定在查询的 GROUP BY或 COMPUTE子句中指定的聚合使用哈希或排列。

{ LOOP| MERGE| HASH|} JOIN

指定在整个查询中所有的联接操作由循环联接、合并联接或哈希联接来完成。如果指定了不止一个联接提示,则查询优化器为允许的联接选择开销最少的联接策略。如果在同一个查询中也为特定表对指定了联接提示,则该提示在两表的联接中优先。

{ MERGE| HASH| CONCAT} UNION

指定所有的 UNION操作通过合并、哈希或串联 UNION集合来完成。如果指定了不止一个 UNION提示,查询优化器就会从这些指定的提示中选择开销最少的策略。

说明如果在 FROM子句中亦为任何特定联接表对指定了联接提示,则该提示优先于任何 OPTION子句中指定的联接提示。

FAST number_rows

指定对查询进行优化,以便快速检索第一个 number_rows(非负整数)。在第一个 number_rows返回后,查询继续进行并生成完整的结果集。

FORCE ORDER

指定查询语法所指示的联接顺序在查询优化过程中予以保留。

MAXDOP number

只对指定了 sp_configure的 max degree of parallelism配置选项的查询替代该选项。当使用 MAXDOP查询提示时,所有和 max degree of parallelism配置选项一起使用的语义规则均适用。有关更多信息,请参见 max degree of parallelism选项。

ROBUST PLAN

强制查询优化器尝试执行一个计划,该计划以性能为代价获得最大可能的行大小。如果没有可行的计划,则查询优化器返回错误,而不是将错误检测延迟至查询执行。行可能包含长度可变的列;SQL Server允许定义最大可能大小超出 SQL Server处理能力的行。通常,应用程序存储实际大小在 SQL Server处理能力范围内的行,而不管最大可能大小。如果 SQL Server遇到过长的行,则返回执行错误。

KEEP PLAN

强制查询优化器对查询放宽估计的重新编译阈值。当对表中索引列的更改(更新、删除或插入)达到估计数目时查询会自动重新编译,该估计数目即为重新编译阈值。指定 KEEP PLAN将确保当表有多个更新时不会频繁地对查询进行重新编译。

注释

仅当所修改的表是 table变量时,用户定义的函数的主体中才允许使用 UPDATE语句。

table变量在其作用域内可以像常规表一样访问。这样,table变量可作为一个表来使用,在该表中数据用 UPDATE语句进行更新。

用 OPENDATASOURCE函数构造的、作为服务器名称部分的一个四段名称,在 UPDATE语句中可以出现表名的任何地方都可作为表源使用。

如果对行的更新违反了某个约束或规则,或违反了对列的 NULL设置,或者新值是不兼容的数据类型,则取消该语句、返回错误并且不更新任何记录。

当 UPDATE语句在表达式取值过程中遇到算术错误(溢出、被零除或域错误)时,则不进行更新。批处理的剩余部分不再执行,并且返回错误信息。

如果对参与聚集索引的一列或多列的更新导致聚集索引和行的大小超过 8,060字节,则更新失败并且返回错误信息。

当对表的 UPDATE操作定义 INSTEAD-OF触发器时,将执行触发器而不执行 UPDATE语句。SQL Server以前的版本只支持在 UPDATE和其它数据修改语句中定义 AFTER触发器。

当更新查询既更新聚集键又更新一个或多个 text、image或 Unicode列时,如果可以更改不止一行,则更新操作失败,SQL Server返回错误信息。

用 UPDATE修改 text、ntext或 image列时将对列进行初始化,向其指派有效文本指针,并且分配至少一个数据页(除非用 NULL更新该列)。

说明 UPDATE语句将记入日志。如果要替换或修改大块的 text、ntext或 image数据,请使用 WRITETEXT或 UPDATETEXT语句而不要使用 UPDATE语句。WRITETEXT和 UPDATETEXT语句(根据默认)不记入日志。

所有的 char和 nchar列向右填充至定义长度。

对于用于远程表以及本地和远程分区视图的 UPDATE语句,忽略 SET ROWCOUNT选项的设置。

如果 ANSI_PADDING设置为 OFF,则会从插入 varchar和 nvarchar列的数据中删除所有尾随空格,但只包含空格的字符串除外。这些字符串被截断为空字符串。如果 ANSI_PADDING设置为 ON,则插入尾随空格。Microsoft SQL Server ODBC驱动程序和用于 SQL Server的 OLE DB提供程序自动对每个连接设置 ANSI_PADDING ON。这可在 ODBC数据源中进行配置,或者通过设置连接特性或属性进行设置。

使用 WHERE CURRENT OF子句的定位更新将在游标的当前位置更新单行。这比使用 WHERE<search_condition>子句限定要更新的行的搜索更新更为精确。当搜索条件不唯一标识一行时,搜索更新将修改多行。

如果 UPDATE语句包含了未指定每个所更新列的位置只有一个可用值的 FROM子句(换句话说,如果 UPDATE语句是不确定性的),则其结果将不明确。例如,对于下面脚本中的 UPDATE语句,表 s中的两行都满足 UPDATE语句中的 FROM子句的限定条件,但是将用 s的哪一行来更新表 t内的行是不明确的。

CREATE TABLE s(ColA INT, ColB DECIMAL(10,3))

GO

CREATE TABLE t(ColA INT PRIMARY KEY, ColB DECIMAL(10,3))

GO

INSERT INTO s VALUES(1, 10.0)

INSERT INTO s VALUES(1, 20.0)

INSERT INTO t VALUES(1, 0.0)

GO

UPDATE t

SET t.ColB= t.ColB+ s.ColB

FROM t INNER JOIN s ON(t.ColA= s.ColA)

GO

当组合 FROM和 WHERE CURRENT OF子句时,可能发生同样的问题。在本例中,表 t2中的两行都满足 UPDATE语句中的 FROM子句的限定条件。将用表 t2的哪一行来更新表 t1中的行是不明确的。

CREATE TABLE t1(c1 INT PRIMARY KEY, c2 INT)

GO

CREATE TABLE t2(d1 INT PRIMARY KEY, d2 INT)

GO

INSERT INTO t1 VALUES(1, 10)

INSERT INTO t2 VALUES(1, 20)

INSERT INTO t2 VALUES(2, 30)

go

DECLARE abc CURSOR LOCAL FOR

SELECT* FROM t1

OPEN abc

FETCH abc

UPDATE t1 SET c2= c2+ d2

FROM t2

WHERE CURRENT OF abc

GO

设置变量和列

变量名可用于 UPDATE语句来显示受影响的旧值和新值。这种方法应该仅用在 UPDATE语句只影响单个记录时;如果 UPDATE语句影响多个记录,则变量只含有所更新行中的一行的值。

权限

UPDATE权限默认授予 sysadmin固定服务器角色成员、db_owner和 db_datawriter固定数据库角色成员以及表的所有者。sysadmin、db_owner和 db_securityadmin角色的成员和表所有者可以将权限转让给其他用户。

如果 UPDATE语句包含 WHERE子句,或 SET子句中的 expression使用了表中的某个列,则还要求所更新表的 SELECT权限。

示例

A.使用简单的 UPDATE

下列示例说明如果从 UPDATE语句中去除 WHERE子句,所有的行会受到什么影响。

下面这个例子说明,如果表 publishers中的所有出版社将总部搬迁到佐治亚州的亚特兰大市,表 publishers如何更新。

UPDATE publishers

SET city='Atlanta', state='GA'

本示例将所有出版商的名字变为 NULL。

UPDATE publishers

SET pub_name= NULL

也可以在更新中使用计算值。本示例将表 titles中的所有价格加倍。

UPDATE titles

SET price= price* 2

B.把 WHERE子句和 UPDATE语句一起使用

WHERE子句指定要更新的行例如,在下面这个虚构的事件中,北加利福尼亚更名为 Pacifica(缩写为 PC),而奥克兰的市民投票决定将其城市的名字改为 Bay City。这个例子说明如何为奥克兰市以前的所有居民(他们的地址已经过时)更新表 authors。

UPDATE authors

SET state='PC', city='Bay City'

WHERE state='CA' AND city='Oakland'

必须编写另一个语句来更改北加利福尼亚其它城市的居民所在的州名。

C.通过 UPDATE语句使用来自另一个表的信息

本示例修改表 titles中的 ytd_sales列,以反映表 sales中的最新销售记录。

UPDATE titles

SET ytd_sales= titles.ytd_sales+ sales.qty

FROM titles, sales

WHERE titles.title_id= sales.title_id

AND sales.ord_date=(SELECT MAX(sales.ord_date) FROM sales)

这个例子假定,一种特定的商品在特定的日期只记录一批销售量,而且更新是最新的。如果不是这样(即如果一种特定的商品在同一天可以记录不止一批销售量),这里所示的例子将出错。例子可正确执行,但是每种商品只用一批销售量进行更新,而不管那一天实际销售了多少批。这是因为一个 UPDATE语句从不会对同一行更新两次。

对于特定的商品在同一天可销售不止一批的情况,每种商品的所有销售量必须在 UPDATE语句中合计在一起,如下例所示:

UPDATE titles

SET ytd_sales=

(SELECT SUM(qty)

FROM sales

WHERE sales.title_id= titles.title_id

AND sales.ord_date IN(SELECT MAX(ord_date) FROM sales))

FROM titles, sales

D.将 UPDATE语句与 SELECT语句中的 TOP子句一起使用

这个例子对来自表 authors的前十个作者的 state列进行更新。

UPDATE authors

SET state='ZZ'

FROM(SELECT TOP 10* FROM authors ORDER BY au_lname) AS t1

WHERE authors.au_id= t1.au_id

insert和update的区别

UPDATE

UPDATE的功能是更新表中的数据。这的语法和INSERT的第二种用法相似。必须提供表名以及SET表达式,在后面可以加WHERE以限制更新的记录范围。

UPDATE table_anem SET column_name1= value1, column_name2= value2,…

WHERE…;

如下面的语句将users表中id等于123的记录的age改为24

UPDATE users SET age= 24 WHERE id= 123;

同样,可以使用UPDATE更新多个字段的值 UPDATE users SET age= 24, name=‘Mike’ WHERE id= 123;

上面的UPDATE语句通过WHERE指定一个条件,否则,UPDATE将更新表中的所有记录的值。

在使用UPDATE更新记录时,如果被更新的字段的类型和所赋的值不匹配时,MySQL将这个值转换为相应类型的值。如果这个字段是数值类型,而且所赋值超过了这个数据类型的最大范围,那么MySQL就将这个值转换为这个范围最大或最小值。如果字符串太长,MySQL就将多余的字符串截去。如果设置非空字段为空,那么将这个字段设置为它们的默认值,数字的默认值是0,字符串的默认值是空串(不是null,是”")。

有两种情况UPDATE不会对影响表中的数据。

1.当WHERE中的条件在表中没有记录和它匹配时。

2.当我们将同样的值赋给某个字段时,如将字段abc赋为’123′,而abc的原值就是’123′。

和INSERT、REPLACE一样,UPDATE也返回所更新的记录数。但这些记录数并不包括满足WHERE条件的,但却未被更新的记录。如下同的UPDATE语句就未更新任何记录。

UPDATE users SET age= 30 WHERE id= 12;

Query OK, 0 rows affected(0.00 sec)

需要注意的时,如果一个字段的类型是TIMESTAMP,那么这个字段在其它字段更新时自动更新。

在有些时候我们需要得到UPDATE所选择的行数,而不是被更新的行数。我们可以通过一些API来达到这个目的。如MySQL提供的C API提供了一个选项可以得到你想要的记录数。而MySQL的JDBC驱动得到的默认记录数也是匹配的记录数。

UPDATE和REPLACE基本类似,但是它们之间有两点不同。

1. UPDATE在没有匹配记录时什么都不做,而REPLACE在有重复记录时更新,在没有重复记录时插入。

2. UPDATE可以选择性地更新记录的一部分字段。而REPLACE在发现有重复记录时就将这条记录彻底删除,再插入新的记录。也就是说,将所有的字段都更新了。

INSERT和REPLACE

INSERT和REPLACE语句的功能都是向表中插入新的数据。这两条语句的语法类似。它们的主要区别是如何处理重复的数据。

1. INSERT的一般用法

MySQL中的INSERT语句和标准的INSERT不太一样,在标准的SQL语句中,一次插入一条记录的INSERT语句只有一种形式。

INSERT INTO tablename(列名…) VALUES(列值);

而在MySQL中还有另外一种形式。

INSERT INTO tablename SET column_name1= value1, column_name2= value2,…;

第一种方法将列名和列值分开了,在使用时,列名必须和列值的数一致。如下面的语句向users表中插入了一条记录:

INSERT INTO users(id, name, age) VALUES(123,‘姚明’, 25);

第二种方法允许列名和列值成对出现和使用,如下面的语句将产生中样的效果。

INSERT INTO users SET id= 123, name=‘姚明’, age= 25;

如果使用了SET方式,必须至少为一列赋值。如果某一个字段使用了省缺值(如默认或自增值),这两种方法都可以省略这些字段。如id字段上使用了自增值,上面两条语句可以写成如下形式:

INSERT INTO users(name, age) VALUES(‘姚明’,25);

INSERT INTO uses SET name=‘姚明’, age= 25;

MySQL在VALUES上也做了些变化。如果VALUES中什么都不写,那MySQL将使用表中每一列的默认值来插入新记录。

INSERT INTO users() VALUES();

如果表名后什么都不写,就表示向表中所有的字段赋值。使用这种方式,不仅在VALUES中的值要和列数一致,而且顺序不能颠倒。 INSERT INTO users VALUES(123,‘姚明’, 25);

如果将INSERT语句写成如下形式MySQL将会报错。

INSERT INTO users VALUES(‘姚明’,25);

2.使用INSERT插入多条记录

看到这个标题也许大家会问,这有什么好说的,调用多次INSERT语句不就可以插入多条记录了吗!但使用这种方法要增加服务器的负荷,因为,执行每一次 SQL服务器都要同样对SQL进行分析、优化等操作。幸好MySQL提供了另一种解决方案,就是使用一条INSERT语句来插入多条记录。这并不是标准的 SQL语法,因此只能在MySQL中使用。

INSERT INTO users(name, age)

VALUES(‘姚明’, 25),(‘比尔.盖茨’, 50),(‘火星人’, 600);

上面的INSERT语句向users表中连续插入了3条记录。值得注意的是,上面的INSERT语句中的VALUES后必须每一条记录的值放到一对(…)中,中间使用”,”分割。假设有一个表table1

CREATE TABLE table1(n INT);

如果要向table1中插入5条记录,下面写法是错误的:

INSERT INTO table1(i) VALUES(1,2,3,4,5);

MySQL将会抛出下面的错误

ERROR 1136: Column count doesn’t match value count at row 1

而正确的写法应该是这样:

INSERT INTO t able1(i) VALUES(1),(2),(3),(4),(5);

当然,这种写法也可以省略列名,这样每一对括号里的值的数目必须一致,而且这个数目必须和列数一致。如:

INSERT INTO t able1 VALUES(1),(2),(3),(4),(5);

3. REPLACE语句

我们在使用数据库时可能会经常遇到这种情况。如果一个表在一个字段上建立了唯一索引,当我们再向这个表中使用已经存在的键值插入一条记录,那将会抛出一个主键冲突的错误。当然,我们可能想用新记录的值来覆盖原来的记录值。如果使用传统的做法,必须先使用DELETE语句删除原先的记录,然后再使用 INSERT插入新的记录。而在MySQL中为我们提供了一种新的解决方案,这就是REPLACE语句。使用REPLACE插入一条记录时,如果不重复,REPLACE就和INSERT的功能一样,如果有重复记录,REPLACE就使用新记录的值来替换原来的记录值。

使用REPLACE的最大好处就是可以将DELETE和INSERT合二为一,形成一个原子操作。这样就可以不必考虑在同时使用DELETE和INSERT时添加事务等复杂操作了。

在使用REPLACE时,表中必须有唯一索引,而且这个索引所在的字段不能允许空值,否则REPLACE就和INSERT完全一样的。

在执行REPLACE后,系统返回了所影响的行数,如果返回1,说明在表中并没有重复的记录,如果返回2,说明有一条重复记录,系统自动先调用了 DELETE删除这条记录,然后再记录用INSERT来插入这条记录。如果返回的值大于2,那说明有多个唯一索引,有多条记录被删除和插入。

REPLACE的语法和INSERT非常的相似,如下面的REPLACE语句是插入或更新一条记录。

REPLACE INTO users(id,name,age) VALUES(123,‘赵本山’, 50);

插入多条记录:

REPLACE INTO users(id, name, age)

VALUES(123,‘赵本山’, 50),(134,’Mary’,15);

REPLACE也可以使用SET语句

REPLACE INTO users SET id= 123, name=‘赵本山’, age= 50;

上面曾提到REPLACE可能影响3条以上的记录,这是因为在表中有超过一个的唯一索引。在这种情况下,REPLACE将考虑每一个唯一索引,并对每一个索引对应的重复记录都删除,然后插入这条新记录。假设有一个table1表,有3个字段a, b, c。它们都有一个唯一索引。

CREATE TABLE table1(a INT NOT NULL UNIQUE,b INT NOT NULL UNIQUE,c INT NOT NULL UNIQUE);

假设table1中已经有了3条记录

a b c

1 1 1

2 2 2

3 3 3

下面我们使用REPLACE语句向table1中插入一条记录。

REPLACE INTO table1(a, b, c) VALUES(1,2,3);

返回的结果如下

Query OK, 4 rows affected(0.00 sec)

在table1中的记录如下

a b c

1 2 3

我们可以看到,REPLACE将原先的3条记录都删除了,然后将(1, 2, 3)插入。

什么是update set语句

update set语句是数据库操作中用于修改表中数据的关键工具。其基本格式是:使用"update table_name set column1= new_value,..., column_n= new_value [where condition]"。例如,如果你想将名为'MyClass'表中id为1的记录的name字段改为'Mary',可以执行命令:mysql> update MyClass set name='Mary' where id=1。

针对单表的UPDATE语句,如MySQL,其完整形式为:UPDATE [LOW_PRIORITY| IGNORE] tbl_name SET column1=expr1, column2=expr2 WHERE where_definition,可以指定列的更新值和更新条件。如果省略WHERE子句,所有符合条件的行都将被更新;若包含ORDER BY子句,会按照指定顺序更新行;而LIMIT子句则可以设置更新行的数量上限。

对于涉及多个表的UPDATE语句,其结构类似,只需将table_name替换为table_references,并对相关列和值进行操作,同时WHERE子句用于确定哪些行将被更新。总的来说,update set语句通过SET子句指明要修改的列和值,WHERE子句进行行的筛选,确保数据的准确更新。

OK,关于update语句执行顺序和数据库查询语句执行顺序的内容到此结束了,希望对大家有所帮助。

有没有免费学编程的网站(新手怎么开始学编程)html框架代码?html代码生成图片