日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

(MariaDB/MySQL)之DML(2):数据更新、删除

發(fā)布時(shí)間:2024/9/5 数据库 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (MariaDB/MySQL)之DML(2):数据更新、删除 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

這個(gè)文章是轉(zhuǎn)自:http://www.cnblogs.com/f-ck-need-u/p/8912026.html

1.update語(yǔ)句

update用于修改表中記錄。

# 單表更新語(yǔ)法: UPDATE [LOW_PRIORITY] [IGNORE] table_reference [PARTITION (partition_list)]SET col1={expr1|DEFAULT} [,col2={expr2|DEFAULT}] ...[WHERE where_condition][ORDER BY ...][LIMIT row_count]# 多表更新語(yǔ)法: UPDATE [LOW_PRIORITY] [IGNORE] table_referencesSET col1={expr1|DEFAULT} [, col2={expr2|DEFAULT}] ...[WHERE where_condition]

先簡(jiǎn)單介紹下各子句和關(guān)鍵字相關(guān)的功能,后文將詳細(xì)解釋它們。

  • low_priority只對(duì)使用表級(jí)鎖的存儲(chǔ)引擎有效(如MyISAM和Aria),它設(shè)置delete語(yǔ)句的優(yōu)先級(jí)低于讀操作,使update延遲到?jīng)]有任何進(jìn)程訪問(wèn)表的時(shí)候才會(huì)執(zhí)行。見:(MariaDB/MySQL)MyISAM存儲(chǔ)引擎讀、寫操作的優(yōu)先級(jí)。
  • ignore是在更新某行出錯(cuò)的時(shí)候忽略錯(cuò)誤,繼續(xù)更新其他行。
  • where子句篩選出要更新的行。如果不給定where子句,則update會(huì)更新整張表中的所有行。
  • order by子句表示先對(duì)篩選出來(lái)的數(shù)據(jù)排序,排序后按順序更新這些行。在更新某些行的時(shí)候,使用order by能解決一些錯(cuò)誤。
  • limit子句表示更新一定數(shù)量的行。

例如:

# 單表更新 UPDATE table_name SET column1 = value1, column2 = value2 WHERE id=100;

按排序更新指定行數(shù)。

update book set bookcount=2 where bookname in ('ss') order by bookid limit 10;

多表更新。注意,下面的語(yǔ)句會(huì)更新兩張表中的數(shù)據(jù)。

UPDATE BOOK,BOOK2 SET BOOK.bookcount=2 ,BOOK2.bookcount=3 WHERE BOOK.bookid=1 AND BOOK2.bookid=1;

基于其他表來(lái)更新某表數(shù)據(jù)。注意,下面的語(yǔ)句只更新一張表中的數(shù)據(jù)。

update t,t1 set t1.name='newname' where t1.id=t2.id; update t set name='newname' where t.id=(select max(id) from t1);

注意,SQL Server支持下面的update from語(yǔ)法,但是MySQL/MariaDB不支持。

-- 使用多表聯(lián)接為軟件測(cè)試低于65分的學(xué)生減5分 UPDATE TScore SET mark = mark - 5 FROM TScore a JOIN TSubject b ON a.subJectID = b.subJectID WHERE b.subJectName = '軟件測(cè)試' AND mark < 65

下面是關(guān)于update需要注意的幾種特殊情況。

(1).更新時(shí)有鍵值重復(fù)時(shí),可以考慮使用order by子句。

例如,下面的表:id為主鍵,不允許重復(fù)。

create or replace table t(id int primary key,sex char(3),name char(20)); insert into t values(1,'nan','longshuai1'),(2,'nan','longshuai2'),(3,'nv','xiaofang1'),(4,'nv','xiaofang2'),(5,'nv','xiaofang3'),(6,'nv','xiaofang4'),(7,'nv','tun\'er'),(8,'nan','longshuai3');

下面的語(yǔ)句將更新失敗,因?yàn)槿绻鲁晒?#xff0c;主鍵id將重復(fù)。

update t set id=id+1 where id>5; ERROR 1062 (23000): Duplicate entry '7' for key 'PRIMARY'

但使用order by之后,將能正常更新,因?yàn)闀?huì)先排序,然后按降序結(jié)果集進(jìn)行更新。

update t set id=id+1 where id>5 order by id desc; select * from t where id>5; +----+------+------------+ | id | sex | name | +----+------+------------+ | 7 | nv | xiaofang4 | | 8 | nv | tun'er | | 9 | nan | longshuai3 | +----+------+------------+

(2).一定要注意update中set賦值語(yǔ)句的同時(shí)性。

多個(gè)賦值語(yǔ)句是從左到右評(píng)估的,除非sql_mode指定了SIMULTANEOUS_ASSIGNMENT模式(從MariaDB 10.3.5開始支持該模式),這種情況下UPDATE語(yǔ)句是同時(shí)評(píng)估所有賦值語(yǔ)句的。(注:標(biāo)準(zhǔn)SQL的update賦值語(yǔ)句就是同時(shí)性的)

例如,給定如下表:

CREATE OR REPLACE TABLE tx (c1 INT, c2 INT); INSERT INTO tx VALUES (10,10);

下面的update能正確執(zhí)行,更新后c2字段的值和c1的值相同。

UPDATE tx SET c1=c1+1,c2=c1; SELECT * FROM tx; +------+------+ | c1 | c2 | +------+------+ | 11 | 11 | +------+------+

設(shè)置sql_mode模式SIMULTANEOUS_ASSIGNMENT,再執(zhí)行相同的更新語(yǔ)句。

/* 由于同時(shí)評(píng)估各賦值語(yǔ)句,所以更新后c1的值會(huì)加1,c2的值等于更新前的c1 */ SET @@sql_mode=CONCAT(@@sql_mode,',SIMULTANEOUS_ASSIGNMENT'); UPDATE tx SET c1=c1+1,c2=c1; SELECT * FROM tx; +------+------+ | c1 | c2 | +------+------+ | 12 | 11 | +------+------+

(3).更新源和目標(biāo)相同的數(shù)據(jù)。

在MariaDB 10.3.2之前,執(zhí)行下面的update語(yǔ)句會(huì)失敗。

update t set id='10' where id=(select max(t.id) from t); ERROR 1093 (HY000): Table 't' is specified twice, both as a target for 'UPDATE' and as a separate source for data

但是從MariaDB 10.3.2開始,允許執(zhí)行這樣的update語(yǔ)句。

2.delete語(yǔ)句

delete用于刪除表中記錄。可以刪除單表數(shù)據(jù),也可以刪除多表數(shù)據(jù)。

先看語(yǔ)法:

# 單表刪除語(yǔ)法 DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name [PARTITION (partition_list)][WHERE where_condition][ORDER BY ...][LIMIT row_count][RETURNING select_expr [, select_expr ...]]# 多表語(yǔ)法: DELETE [LOW_PRIORITY] [QUICK] [IGNORE]tbl_name[.*] [, tbl_name[.*]] ...FROM table_references[WHERE where_condition] # 或: DELETE [LOW_PRIORITY] [QUICK] [IGNORE]FROM tbl_name[.*] [, tbl_name[.*]] ...USING table_references[WHERE where_condition]

?

先簡(jiǎn)單介紹下各子句和關(guān)鍵字相關(guān)的功能,后文將詳細(xì)解釋它們。

  • from子句指定要?jiǎng)h除的哪張表中的數(shù)據(jù),如果是多表語(yǔ)法,則可能只是提供引用功能,不一定會(huì)刪除其中的數(shù)據(jù)。
  • low_priority只對(duì)使用表級(jí)鎖的存儲(chǔ)引擎有效(如MyISAM和Aria),它設(shè)置delete語(yǔ)句的優(yōu)先級(jí)低于讀操作,使delete延遲到?jīng)]有任何進(jìn)程訪問(wèn)表的時(shí)候才會(huì)執(zhí)行。見:(MariaDB/MySQL)MyISAM存儲(chǔ)引擎讀、寫操作的優(yōu)先級(jí)。
  • quick是通知存儲(chǔ)引擎將刪除操作合并起來(lái),存儲(chǔ)引擎收到這個(gè)通知后,刪除多行的操作會(huì)合并成一個(gè)批,當(dāng)批的大小達(dá)到一定程度之后才一次性刪除,一定程度上能提升刪除數(shù)據(jù)的效率。對(duì)InnoDB/XtraDB可能無(wú)效,但對(duì)MyISAM和Aria是有效的。
  • ignore是在刪除某行出錯(cuò)的時(shí)候忽略錯(cuò)誤,繼續(xù)刪除其他行。
  • where子句篩選出要?jiǎng)h除的行。如果不給定where子句,則delete會(huì)刪除整張表中的所有行。
  • order by子句表示先對(duì)篩選出來(lái)的數(shù)據(jù)排序,排序后按順序刪除這些行。
  • limit子句表示刪除一定數(shù)量的行。
  • returning子句用于返回所刪除的行相關(guān)的數(shù)據(jù)。這是一個(gè)MariaDB非常人性化的功能,不僅可以讓我們知道刪除了哪些行,某些時(shí)候還能借此恢復(fù)誤刪除的行MySQL不支持該功能。
  • using子句用于多表刪除語(yǔ)法。

MySQL/MariaDB中delete語(yǔ)句中必須使用from子句。單表刪除時(shí),表名必須放在from子句中,而多表刪除語(yǔ)法中,多表是可以放在from子句之前的。習(xí)慣了SQL Server的人一開始可能會(huì)因此而不習(xí)慣,出于方便的原因,SQL Server中的delete往往會(huì)不寫from子句。

2.1 單表刪除

給定如下表,并插入一些數(shù)據(jù)。

create or replace table t(id int primary key,sex char(3),name char(20)); insert into t values(1,'nan','longshuai1'),(2,'nan','longshuai2'),(3,'nv','xiaofang1'),(4,'nv','xiaofang2'),(5,'nv','xiaofang3'),(6,'nv','xiaofang4'),(7,'nv','tun\'er'),(8,'nan','longshuai3');

刪除sex='nv'且id>6的記錄。

delete from t where id>6 and sex='nv';

對(duì)于delete語(yǔ)句而言,order by子句主要結(jié)合limit子句使用。

delete from t order by id limit 2;

如果使用returning子句,可以自定義刪除行的時(shí)候返回哪些數(shù)據(jù)。注意,MariaDB 10.3.1之前下面的語(yǔ)句會(huì)失敗。見下文。

delete from t where id=(select max(id) from t) returning concat("delete id: ",id) as maxid; +--------------+ | maxid | +--------------+ | delete id: 8 | +--------------+

或者返回刪除行的所有字段的值:

delete from t returning *; +----+------+-----------+ | id | sex | name | +----+------+-----------+ | 3 | nv | xiaofang1 | | 4 | nv | xiaofang2 | | 5 | nv | xiaofang3 | | 6 | nv | xiaofang4 | +----+------+-----------+

注意,下面的delete語(yǔ)句中,刪除的是同源同目標(biāo)數(shù)據(jù)。在MariaDB 10.3.1之前,delete語(yǔ)句無(wú)法刪除這樣的記錄。報(bào)錯(cuò)信息如下:

delete from t where id=(select max(id) from t); ERROR 1093 (HY000): Table 't' is specified twice, both as a target for 'DELETE' and as a separate source for data

但從MariaDB 10.3.1之后,允許刪除這樣的記錄。

2.2 多表刪除

兩種語(yǔ)法,一種語(yǔ)法是將表引用放在from子句之前,另一種語(yǔ)法是使用using子句。它們其實(shí)是等價(jià)的。

如果下面的語(yǔ)法不明白,請(qǐng)將delete tbl_name這部分替換成select column_list來(lái)考慮。delete的執(zhí)行過(guò)程和select是一樣的,只不過(guò)是篩選數(shù)據(jù)后,一個(gè)是對(duì)篩選的結(jié)果集進(jìn)一步select,一個(gè)是delete篩選出來(lái)的結(jié)果集。

下面的語(yǔ)句會(huì)刪除t和t1兩張表中滿足id相等的記錄。注意,是兩張表中的內(nèi)容都刪除。

delete t,t1 from t join t1 on t.id=t1.id; # 等價(jià)于 delete from t,t1 using t join t1 on t.id=t1.id;

如果只是要?jiǎng)h除一張表中的內(nèi)容,但需要引用多張表,則可以參考下面的語(yǔ)句。該語(yǔ)句只會(huì)刪除t表的內(nèi)容,不會(huì)刪除t1表的內(nèi)容。

# delete tbl_name1 from tbl_name1 join tbl_name2 .... delete t from t join t1 on t.id=t1.id;

例如,刪除表t中有的記錄,但t1表中沒(méi)有的記錄。

delete t from t left join t1 on t.id=t1.id where t1.id is NULL;

如果使用了別名,那么和select一樣,在delete列表引用表名的時(shí)候,需要使用別名。

# 正確的語(yǔ)法 DELETE a1, a2 FROM t1 AS a1 INNER JOIN t2 AS a2 WHERE a1.id=a2.id; DELETE FROM a1, a2 USING t1 AS a1 INNER JOIN t2 AS a2 WHERE a1.id=a2.id;# 錯(cuò)誤的語(yǔ)法 DELETE t1 AS a1, t2 AS a2 FROM t1 INNER JOIN t2 WHERE a1.id=a2.id; DELETE FROM t1 AS a1, t2 AS a2 USING t1 INNER JOIN t2 WHERE a1.id=a2.id;

3.truncate table

truncate table用于清空一張表。truncate table等價(jià)于drop table + re-create table兩個(gè)操作,因此它是DDL語(yǔ)句而非DML語(yǔ)句,也因此它需要表的drop權(quán)限,且速度比delete表中所有速度要快的多的多,特別是表比較大的時(shí)候。

在re-create表的時(shí)候,它根據(jù)".frm"文件中的表結(jié)構(gòu)來(lái)重建表,因此索引等屬性都會(huì)保留下來(lái)。但auto_increment最近的值會(huì)重置,因?yàn)樵摫肀粍h除,它的auto_increment值全被清空。

如果表上有其他鎖的存在,則truncate table會(huì)失敗。

如果表上有外鍵引用,則truncate table會(huì)失敗。

如果表上有觸發(fā)器,則truncate table不會(huì)觸發(fā)任何觸發(fā)器。因?yàn)镸ariaDB/MySQL不支持DDL觸發(fā)器。

?

本文原創(chuàng)地址在博客園:http://www.cnblogs.com/f-ck-need-u/p/8912026.html

?

?

轉(zhuǎn)載于:https://www.cnblogs.com/duhuo/p/4163889.html

總結(jié)

以上是生活随笔為你收集整理的(MariaDB/MySQL)之DML(2):数据更新、删除的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 69xx网站 | 国产69视频在线观看 | 老熟女重囗味hdxx69 | 日韩精品电影在线观看 | 美女被草视频在线观看 | 国产91精品看黄网站在线观看 | 日本韩国欧美一区 | 久草综合网 | 李华月全部毛片 | 色小姐综合网 | 欧美一区二区三区不卡视频 | 人人超碰在线 | 视频一二三区 | 热热av| 911美女片黄在线观看游戏 | 最近中文字幕 | 欧美俄罗斯乱妇 | 99国产精品自拍 | 91精品一区二区三区四区 | 牛夜精品久久久久久久99黑人 | 亚洲经典av| 欧美日韩国产区 | 精品国产乱码久久久久久图片 | 筱田优全部av免费观看 | 图片区小说区视频区 | 亚洲国产日韩精品 | 华人在线视频 | 涩涩视频在线观看免费 | 91www| 国产美女三级无套内谢 | 美女久久精品 | 久久三区| 一级色网站 | 91欧美视频| 国产乱码精品一区二区 | 一区视频免费观看 | 久久久999 | 成人黄色在线免费观看 | 黄视频免费看在线 | 五十路息子| 久热免费视频 | 久久久久无码国产精品不卡 | 亚洲av永久无码精品国产精品 | 国产精品2018 | 色吧综合网 | 欧美三级大片 | 欧美天天干 | 五十路中出 | 99国产精品久久 | 日韩有码在线观看 | 全部毛片永久免费看 | 国产午夜精品一区二区三区视频 | 丁香花电影高清在线阅读免费 | 精品无码人妻一区二区三区品 | 日本妈妈9 | 亚洲天堂区 | 成人免费网视频 | av网站大全免费 | 天堂网中文在线 | 激情av在线播放 | 性色视频在线 | 免费久久视频 | av中文字幕一区 | 中国国产bdsm紧缚捆绑 | 国产一区亚洲 | 最新日本中文字幕 | 秋霞成人午夜鲁丝一区二区三区 | 国产二页| 国产激情在线播放 | 免费毛片一级 | 噜噜色成人 | 日韩性生活大片 | 成人免费视频一区二区三区 | 精品国产一区二区三区久久久 | 伊人色综合久久天天 | 青青草激情视频 | 91精品久久久久久久久中文字幕 | 91在线观看视频 | 亚洲第一黄色网 | 免费中文字幕日韩欧美 | 国产卡一卡二 | 成人免费看片入口 | 国产精品久久久久久久久夜色 | 亚洲黄色片免费看 | 色哟哟国产精品色哟哟 | 中文字幕在线播放不卡 | 国产日韩精品中文字无码 | 在线观看黄网站 | 巨乳女教师的诱惑 | 桃色视频 | 777中文字幕| 精品国产九九 | 日本打屁股网站 | 日本毛片网站 | 另类三区| 欧美在线看片 | 国产一二区在线 | 亚洲中文无码久久 | 一级国产黄色片 |