最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL數(shù)據(jù)庫表的CRUD操作

 更新時(shí)間:2025年05月16日 08:26:47   作者:IsLand1314~  
這篇文章主要介紹了MySQL數(shù)據(jù)庫表的CRUD操作,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、insert

語法

INSERT [INTO] table_name
    [(column [, column] ...)] #列字段
    VALUES (value_list) [, (value_list)] ... #列字段的內(nèi)容
    
value_list: value, [, value] ...

案例

-- 創(chuàng)建一張學(xué)生表
CREATE TABLE students (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    sn INT NOT NULL UNIQUE COMMENT '學(xué)號(hào)',
    name VARCHAR(20) NOT NULL,
    qq VARCHAR(20)
);

1. 單行數(shù)據(jù) - 全列插入 + 指定列插入

  • 指定列插入:列字段和列字段的內(nèi)容一定要一一匹配
insert into student (sn, name, qq) values (123, '張飛', '12345');
  • 全列插入:全列插入有兩種方式,一個(gè)是省略 values 左側(cè)字段名,一個(gè)是都指定
insert into students values (10, 124, '關(guān)羽', '13245');
insert into students (id, sn, name, qq) values (14, 125, '劉備', '14525');

可以省略 into

insert students (sn, name, qq) values (126, '諸葛亮', '12525');

2. 多行數(shù)據(jù) - 全列插入 + 指定列插入

指定列多行插入

insert students (sn, name, qq) values (127, '曹操', '15256'), (128, '許攸', '23445');

全列多行插入

insert students values (20, 129, '孫權(quán)', '12256'), (21, 130, '呂布', '33445');

3. 插入否則更新

由于 主鍵 或者 唯一鍵 對(duì)應(yīng)的值已經(jīng)存在而導(dǎo)致插入失敗。

但我就是想讓它先確認(rèn)是不是在數(shù)據(jù)庫中存在,不存在就插入,存在不要攔我然后執(zhí)行后面的修改語句。

選擇性的進(jìn)行同步更新操作 語法:

INSERT ... ON DUPLICATE KEY UPDATE
    column = value [, column = value] ...

如果不存在就插入,存在發(fā)生主鍵或者唯一鍵沖突不要報(bào)錯(cuò),接著執(zhí)行后面的修改語句。

insert into students values (14, 111, '周瑜', '56321') on duplicate key update sn=111, name='周瑜', qq=56321;

注意更新的值不能和其他的主鍵和唯一鍵沖突,否則不能更新。

  • 0 row affected:表中有沖突數(shù)據(jù),但沖突數(shù)據(jù)的值和 update 的值相等

  • 1 row affected:表中沒有沖突數(shù)據(jù),數(shù)據(jù)被插入

  • 2 row affected:表中有沖突數(shù)據(jù),并且數(shù)據(jù)已經(jīng)被更新

通過 MySQL 函數(shù)獲取受到影響的數(shù)據(jù)行數(shù)

mysql> select row_count();
+-------------+
| row_count() |
+-------------+
|          -1 |
+-------------+
1 row in set (0.00 sec)

4. 替換

主鍵或者唯一鍵沒有沖突,則直接插入,如果沖突,則 刪除后再插入(replace into)

mysql> insert into students values (22, 31,'Mike', '9856');
Query OK, 1 rows affected (0.00 sec)
mysql> select * from students;
+----+----+------+------+
| id | sn | name | qq   |
+----+----+------+------+
| 22 | 31 | Mike | 9856 |
+----+----+------+------+

mysql> REPLACE INTO students (sn, name, qq) values (31, 'Tom', '9856');
Query OK, 2 rows affected (0.00 sec)

mysql> select * from students;
+----+----+------+------+
| id | sn | name | qq   |
+----+----+------+------+
| 23 | 31 | Tom  | 9856 |
+----+----+------+------+
  • 1 row affected: 表中沒有沖突數(shù)據(jù),數(shù)據(jù)被插入
  • 2 row affected: 表中有沖突數(shù)據(jù),刪除后重新插入
  • 這里從 id 就可以看到是刪除后插入的,因?yàn)?nbsp;id 是自增的,剛才是 22,現(xiàn)在是 23 了。

二、Retrieve

語法:

SELECT
    [DISTINCT] {* | {column [, column] ...}
    [FROM table_name] # 從那個(gè)表篩選
    [WHERE ...] # 篩選條件
    [ORDER BY column [ASC | DESC], ...] # 對(duì)篩選結(jié)果排序
    LIMIT ... # 限定篩選出來的條數(shù)

distinct:對(duì)內(nèi)容進(jìn)行去重

  • *:全列查詢
  • column,column…:指定列查詢

案例

-- 創(chuàng)建表結(jié)構(gòu)
CREATE TABLE exam_result (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL COMMENT '同學(xué)姓名',
    chinese float DEFAULT 0.0 COMMENT '語文成績',
    math float DEFAULT 0.0 COMMENT '數(shù)學(xué)成績',
    english float DEFAULT 0.0 COMMENT '英語成績'
);
 
-- 插入測(cè)試數(shù)據(jù)
INSERT INTO exam_result (name, chinese, math, english) VALUES
    ('唐三藏', 67, 98, 56),
    ('孫悟空', 87, 78, 77),
    ('豬悟能', 88, 98, 90),
    ('曹孟德', 82, 84, 67),
    ('劉玄德', 55, 85, 45),
    ('孫權(quán)', 70, 73, 78),
    ('宋公明', 75, 65, 30);

1. select 列

全列查詢通常情況下不建議使用 * 進(jìn)行全列查詢查詢的列越多,意味著需要傳輸?shù)臄?shù)據(jù)量越大;可能會(huì)影響到 索引 的使用

select * from exam_result;

指定列查詢指定列的順序不需要按定義表的順序來

select id, name, chinese from exam_result;

查詢字段為表達(dá)式 select 非常特殊,后面可以跟 select 自帶的子句,篩選條件等,也可以跟 表達(dá)式

  • 為查詢結(jié)果 指定別名 語法:
SELECT column [AS] alias_name [...] FROM table_name; # 這里 as 可以不帶
  • 結(jié)果去重
select distinct math from exam_result;

2. where 條件

  • 剛剛是對(duì)表的整體信息做篩選,但是實(shí)際在做查詢的時(shí)候一定有篩選條件。
  • 按條件篩選影響的是未來顯示出來信息的條目數(shù)或者說是行數(shù),以前是按列位單位把全部行都拿出來了。
  • 如果一列想拿那些行由 where 條件來決定。

where 是篩選子句,后面可以跟特定的比較運(yùn)算符來決策我們應(yīng)該如何進(jìn)行篩選,

where 就有點(diǎn)像C/C++里面的 if 語句,根據(jù)后面條件進(jìn)行判斷。

?? 比較運(yùn)算符

運(yùn)算符說明
>, >=, <, <=大于,大于等于,小于,小于等于
=等于,NULL 不安全,例如 NULL = NULL 的結(jié)果是 NULL
<=>等于,NULL 安全,例如 NULL <=> NULL 的結(jié)果是 TRUE(1)
!=, <>不等于
value BETWEEN a0 AND a1范圍匹配,[a0, a1],如果 a0 <= value <= a1,返回 TRUE(1)
IN (option, …)如果是 option 中的任意一個(gè),返回 TRUE(1)
IS NULL是 NULL
IS NOT NULL不是 NULL
LIKE模糊匹配。% 表示任意多個(gè)(包括 0 個(gè))任意字符;_表示任意一個(gè)字符

?? 注意事項(xiàng)

  • = 時(shí)兩側(cè)進(jìn)行 null 值比較,是不能參與運(yùn)算的
  • 如果想判斷 null 是否相等 使用 <=>
  • 不過一般也不這樣去判斷,一般更喜歡用 IS NULL 去判斷一個(gè)值是否是null

?? 邏輯運(yùn)算符:

運(yùn)算符說明
AND多個(gè)條件必須都為 TRUE(1),結(jié)果才是 TRUE(1)
OR任意一個(gè)條件為 TRUE(1), 結(jié)果為 TRUE(1)
NOT條件為 TRUE(1),結(jié)果為 FALSE(0)

具體案例

  • 基于上面的建表,下面只會(huì)寫出指令,最終結(jié)果為了節(jié)省篇幅就省略了

① 英語不及格的同學(xué)名字及英語成績 ( < 60 )

select name, english from exam_result where english < 60;

**② **語文成績?cè)?[80, 90] 分的同學(xué)及語文成績 使用 AND 進(jìn)行條件連接

select name, chinese from exam_result where chinese >= 80 and chinese <= 90;

使用 BETWEEN … AND … 條件

select name, chinese from exam_result where chinese between 80 and 90;

③ 數(shù)學(xué)成績是 58 或者 59 或者 98 或者 99 分的同學(xué)及數(shù)學(xué)成績使用 OR 進(jìn)行條件連接,滿足任意一個(gè)就為真

select name, math from exam_result where math = 58 or math = 59 or math = 98 or math = 99;

使用 IN 條件,滿足 () 里任意一個(gè)就為真

select name, math from exam_result where math in (58, 59, 98, 99);
  • 姓孫的同學(xué) 及 孫某同學(xué) 有時(shí)候匹配并不給具體值的更細(xì)節(jié)的字段含義,可能就只給一個(gè)模糊搜索的關(guān)鍵字。就如上面。反正條件不給全就給一個(gè)模糊的條件。
  • 我們就可以用 LIKE 模糊匹配 % 匹配任意多個(gè)(包括 0 個(gè))任意字符注意 MySQL 可以用 ‘ ’ 或者 “ ” 表示字符串
select name from exam_result where name like '孫%';

_ 匹配嚴(yán)格的一個(gè)任意字符:

select name from exam_result where name like '孫_';

④ 語文成績好于英語成績的同學(xué)

select name, chinese, english from exam_result where chinese > english;

⑤ 總分在 200 分以下的同學(xué)

mysql> select name, math + chinese + english total from exam_result where math + chinese + english < 200;
+-----------+-------+
| name      | total |
+-----------+-------+
| 劉玄德    |   185 |
| 宋公明    |   170 |
+-----------+-------+

# 但是寫成這樣就會(huì)有問題
mysql> select name, math + chinese + english as total from exam_result where total < 200;
ERROR 1054 (42S22): Unknown column 'total' in 'where clause'

為啥這里它報(bào)錯(cuò)了未知列total,我們不是做過重命名嗎。這個(gè)total不是已經(jīng)有了嗎,怎么這里報(bào)不知道total呢?

解釋如下:

  • 很簡單,我們一定是先執(zhí)行 from ,在執(zhí)行 where ,然后在執(zhí)行 select
  • 篩選后再執(zhí)行,從 1 中帶著 2 去3中篩選
  • **原因:**只把小于操作 2 的相加后再打印,更節(jié)省空間
  • 所以不可以在 where 中使用重命名

⑥ 語文成績 > 80 并且不姓孫的同學(xué)

AND 與 NOT 的使用

select name, chinese from exam_result where chinese>80 and name not like '孫%';

⑦ 孫某同學(xué),否則要求總成績 > 200 并且 語文成績 < 數(shù)學(xué)成績 并且 英語成績 > 80

要么就是孫某同學(xué),要么就得滿足后面的一堆要求,總共就兩個(gè)條件,在mysql如果條件很多可以用()把這個(gè)條件括起來,表示一個(gè)單元

select name, chinese, math, english, chinese + math + english total 
from exam_result 
where name like '孫_' or (chinese + math + english > 200 and chinese < math and english > 80);

3. 結(jié)果排序 – order by

語法

SELECT ... FROM table_name [WHERE ...]
    ORDER BY column [ASC|DESC], [...];
  • ASC 為升序(從小到大)(ascending)
  • DESC 為降序(從大到?。?descding)
  • 默認(rèn)為 ASC

注意:沒有 ORDER BY 子句的查詢,返回的順序是未定義的,永遠(yuǎn)不要依賴這個(gè)順序

【案例】

  • 基于上面建的表來操作

yi同學(xué)及數(shù)學(xué)成績,按數(shù)學(xué)成績升序顯示

select name, math from exam_result order by math asc;
  • 注意:NULL 視為比任何值都小,升序出現(xiàn)在最上面

② 查詢同學(xué)各門成績,依次按 數(shù)學(xué)降序,英語升序,語文升序的方式顯示

select name, math, english, chinese from exam_result order by math desc, english, chinese;

③ 查詢同學(xué)及總分,由高到低

select name, chinese + math + english total from exam_result order by total desc;
  • 欸,看到這里有個(gè)問題 ? 為什么在order by這里可以使用別名進(jìn)行排序,而where后面沒有辦法使用別名?

因此可以得到一個(gè)結(jié)論:能不能用別名完全是取決于當(dāng)前sql中子句的執(zhí)行順序!

  • 你要對(duì)表結(jié)構(gòu)的數(shù)據(jù)進(jìn)行排序,一定是得先有數(shù)據(jù)!
  • 有人可能說不是表結(jié)構(gòu)不就天然有數(shù)據(jù)嗎,因此就直接可以把表結(jié)構(gòu)數(shù)據(jù)全排完,然后在選行不行,但我們肯定不會(huì)愿意這樣 浪費(fèi)時(shí)間處理數(shù)據(jù)排序
  • 因?yàn)槟銢]有篩選,在排序的時(shí)候一定有大批數(shù)據(jù)其實(shí)是不需要排序的,而對(duì)這些數(shù)據(jù)排序本身就是浪費(fèi)空間和時(shí)間,mysql沒有這么笨!
  • 所以會(huì)先篩選 select 再排序 order by

4. 篩選分頁 – limit

什么是分頁呢?

  • 如果一個(gè)表中數(shù)據(jù)量太大,這個(gè)時(shí)候如果全列查詢就有一大堆,這樣不便于查看分析
  • 有時(shí)候我們不想一次顯示這么多,因此我們就可以對(duì)結(jié)果進(jìn)行 LIMIT 分頁。

limit 本身沒有篩選功能,只是 按照它后面跟的數(shù)字 把要顯示的結(jié)果按照 起始位置 和 步長,給我們顯示多條記錄。

語法

-- 起始下標(biāo)為 0
 
-- 從 s 開始,篩選 n 條結(jié)果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT s, n
 
-- 從 0 開始,篩選 n 條結(jié)果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n;
 
-- 從 s 開始,篩選 n 條結(jié)果,比第二種用法更明確,建議使用
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n OFFSET s;

建議: 對(duì)未知表進(jìn)行查詢時(shí),最好加一條 LIMIT 1,避免因?yàn)楸碇袛?shù)據(jù)過大,查詢?nèi)頂?shù)據(jù)導(dǎo)致數(shù)據(jù)庫卡死。

  • 默認(rèn)從 0 下標(biāo)開始,篩選多條記錄。
  • limit 分頁讀取的執(zhí)行順序,是在最后的
  • 也可以指定下標(biāo)開始篩選后面跟的是步長。從指定位置開始,連續(xù)讀取多條記錄。

如下

mysql> select id, name, math from exam_result order by id limit 3 offset 0;
+----+-----------+------+
| id | name      | math |
+----+-----------+------+
|  1 | 唐三藏    |   98 |
|  2 | 孫悟空    |   78 |
|  3 | 豬悟能    |   98 |
+----+-----------+------+

mysql> select id, name, math from exam_result order by id limit 3 offset 6;
+----+-----------+------+
| id | name      | math |
+----+-----------+------+
|  7 | 宋公明    |   65 |
+----+-----------+------+
  • LIMIT 后面跟的是篩選幾行,OFFSET 后面跟的是從那行開始。
  • limit 可以進(jìn)行分頁。就比如數(shù)據(jù)多就可以這樣進(jìn)行 分頁讀

關(guān)鍵字執(zhí)行順序總結(jié)

  • **from > on> join > where > group by > with > having > select(**含重命名) > distinct > order by > limit

三、Update | Delete | 插入查詢結(jié)果

3.1 Update

語法

UPDATE table_name SET column = expr [, column = expr ...]
    [WHERE ...] [ORDER BY ...] [LIMIT ...]
  • set 后面跟的是要重新設(shè)定的值,可以是多列。
  • 一般在 update 的時(shí)候必須采用對(duì)應(yīng) where 子句進(jìn)行條件篩選,如果沒有的話會(huì)把這個(gè)表中指定的列全部都更新,這是不合理的。

【案例】:基于上面創(chuàng)建的 exam_result 表

對(duì)查詢到的結(jié)果進(jìn)行列值更新: set

① 將孫悟空同學(xué)的數(shù)學(xué)成績變更為 80 分

update exam_result set math=80 where name='孫悟空';

② 將曹孟德同學(xué)的數(shù)學(xué)成績變更為 60 分,語文成績變更為 70 分

update exam_result set math=60, chinese=70 where name='曹孟德';

③ 將總成績倒數(shù)前三的 3 位同學(xué)的數(shù)學(xué)成績加上 30 分

  • 更新值為原值基礎(chǔ)上變更。
  • 注意據(jù)更新,不支持 math += 30 這種語法。

④ 將所有同學(xué)的語文成績更新為原來的 2 倍

update exam_result set chinese=chinese*2;

注意:更新全表的語句慎用!

3.2 Delete

語法:

DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]
  • 一般都是拿著條件刪除 where
  • 不加條件就是把整表的內(nèi)容刪除了,不過表結(jié)構(gòu)還在。
  • 刪表結(jié)構(gòu)drop

比如刪除之前 exam_result 中的孫悟空的成績,如下:

delete from exam_result where name='孫悟空';

我們?cè)賮韨€(gè)測(cè)試,測(cè)試表 如下:

-- 準(zhǔn)備測(cè)試表
create table for_delete(id int primary key auto_increment, name varchar(20));
 
 
-- 插入測(cè)試數(shù)據(jù)
INSERT INTO for_delete (name) VALUES ('A'), ('B'), ('C');

-- 查詢表數(shù)據(jù)
select * from for_delete;
+----+------+
| id | name |
+----+------+
|  1 | A    |
|  2 | B    |
|  3 | C    |
+----+------+

現(xiàn)在我們可以看到id設(shè)置了自增,目前已經(jīng)插入三條記錄了,如果在插入一條記錄這個(gè)id就是4了。

但我們現(xiàn)在不插直接把表刪除,如下:

-- 刪除表
delete from for_delete;

mysql> show create table for_delete \G;
*************************** 1. row ***************************
       Table: for_delete
Create Table: CREATE TABLE `for_delete` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)


mysql> select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
|                1 |
+------------------+

-- 插入新數(shù)據(jù)
insert into for_delete(name) values('E');

mysql> select * from for_delete;
+----+------+
| id | name |
+----+------+
|  4 | E    |
+----+------+

當(dāng)新插入一條記錄時(shí)這個(gè)id是4,并且自增長已經(jīng)變成下一個(gè)id值了

  • 說明 delete from 清空表 的方式不會(huì)將 自增值置 0

清空表還有一種做法叫做 截?cái)啾?/strong>。在效果和 delete 一模一樣,但是在細(xì)節(jié)和原理是有差別的。

截?cái)啾?/h3>

語法

TRUNCATE [TABLE] table_name

注意:這個(gè)操作慎用

  • 只能對(duì)整表操作,不能像 DELETE 一樣針對(duì)部分?jǐn)?shù)據(jù)操作;
  • 實(shí)際上 MySQL 不對(duì)數(shù)據(jù)操作,所以比 DELETE 更快,但是 TRUNCATE 在刪除數(shù)據(jù)的時(shí)候,并不經(jīng)過真正的事物,所以無法回滾
  • 會(huì)重置 AUTO_INCREMENT 項(xiàng)

【案例】:

mysql> select * from for_delete; # 操作前
+----+------+
| id | name |
+----+------+
|  4 | E    |
+----+------+

-- 插入
insert into for_delete(name) values('A'), ('B'), ('C');

-- truncate 操作
mysql> truncate for_delete;
Query OK, 0 rows affected (0.04 sec)

mysql> insert into for_delete(name) values('E');
Query OK, 1 row affected (0.01 sec)

mysql> select * from for_delete; # 操作后
+----+------+
| id | name |
+----+------+
|  1 | E    |
+----+------+
  • 可以看到表結(jié)構(gòu)還在,但是內(nèi)容已經(jīng)被清空了。但是這里值得注意的一點(diǎn)是,之前自增長是5,現(xiàn)在 truncata 清空表后自增長已經(jīng)沒有了。
  • 然后新插一條記錄,id變成1了。自增長 變成 2 了
  • 換句話說 truncate 會(huì)重置自增長。而 delete 并不會(huì)。

實(shí)際上,TRUNCATE 和 DELETE 還存在一些差異。TRUNCATE 操作是直接將表中的數(shù)據(jù)清空,并且這個(gè)操作不通過事務(wù)處理。而 DELETE 和其他 SQL 操作則會(huì)在執(zhí)行時(shí)被包裝進(jìn) 事務(wù) 中,再由 MySQL 處理。

事務(wù)的影響

事務(wù) 的使用與否會(huì)影響 MySQL 對(duì)操作信息的記錄方式。MySQL 使用其自身的 日志系統(tǒng) 來記錄數(shù)據(jù)操作的信息,主要包括以下幾種 日志

  • bin.log:存儲(chǔ)經(jīng)過優(yōu)化的歷史 SQL 語句。
  • redo.log:用于在 MySQL 遭遇宕機(jī)時(shí)能夠恢復(fù)數(shù)據(jù)。
  • undo.log:用于存儲(chǔ)回滾段信息。

日志的作用

  • bin.log 記錄的是歷史 SQL 語句,并支持 MySQL 的主從同步機(jī)制。當(dāng)一個(gè)數(shù)據(jù)庫執(zhí)行完某些操作后,可以通過 bin.log 將這些 SQL 同步到另一個(gè)數(shù)據(jù)庫,從而使兩個(gè)數(shù)據(jù)庫的數(shù)據(jù)保持一致(主從同步), 需要注意,默認(rèn)情況下 bin.log 是 關(guān)閉 的。
  • redo.log 在 MySQL 遇到故障時(shí) 提供數(shù)據(jù)恢復(fù)功能

持久化方式

持久化方式指的是為了能夠在系統(tǒng)崩潰后快速恢復(fù)數(shù)據(jù)庫數(shù)據(jù) 的方法。

將數(shù)據(jù)以文件的形式寫入磁盤,通常有兩種方式

  • 記錄歷史sql語句
  • 記錄數(shù)據(jù)本身

Truncate的特點(diǎn)

由于 TRUNCATE 不記錄自己的操作到 日志 中,也不將其作為 事務(wù) 的一部分,因此它僅是簡單地清空表中的數(shù)據(jù),這樣做的結(jié)果是 TRUNCATE 的執(zhí)行速度較快。

  • TRUNCATE 因?yàn)槠浞鞘聞?wù)性及不記錄日志的特點(diǎn),在執(zhí)行速度上有優(yōu)勢(shì)
  • 但在數(shù)據(jù)恢復(fù)和一致性方面不如 DELETE

3.3 插入查詢結(jié)果

語法

INSERT INTO table_name [(column [, column ...])] SELECT ...

我們要插就插,要?jiǎng)h就刪,要改就改,要查就查,實(shí)際我們也可以將select和insert組合??梢园褦?shù)據(jù)從其他表里面篩選出來,然后插入到另一個(gè)表里面。

我們來實(shí)現(xiàn)如下一個(gè)小實(shí)驗(yàn):

刪除表中的重復(fù)記錄,重復(fù)的數(shù)據(jù)只能有一份,現(xiàn)在我們有如下的一個(gè)表:

mysql> select * from duplicate_t;
+------+------+
| id   | name |
+------+------+
|    1 | a    |
|    1 | a    |
|    2 | b    |
+------+------+

我的做法是

  • 創(chuàng)建一個(gè)和原表一樣結(jié)構(gòu)的空表 no_duplicate_t,

  • 從原始表中把去重之后的結(jié)果篩選出來插入到 no_duplicate_t 這個(gè)表不就是不重復(fù)的嘛

  • 然后對(duì) duplicate_t 重命名,no_duplicate_t 改名字為 duplicate_t。最終不就完成了對(duì) duplicate_t去重

mysql> create table no_duplicate_t like duplicate_t; # 創(chuàng)建完全一樣的表,用 like
mysql> insert into no_duplicate_t select distinct * from duplicate_t; # 全列插入就不用指定列

-- 重命名
mysql> rename table duplicate_t to old_duplicate_t;
mysql> rename table no_duplicate_t to duplicate_t;

mysql> select * from duplicate_t; # 查詢最終結(jié)果
+------+------+
| id   | name |
+------+------+
|    1 | a    |
|    2 | b    |
+------+------+

?這里有個(gè)細(xì)節(jié)問題,為什么最后是通過 rename 方式進(jìn)行的?

如果今天想把一個(gè)文件上傳到 linux 上,比如這個(gè)文件是1G上傳時(shí)間可能是10分鐘,我們想把這個(gè)文件上傳號(hào)之后放到一個(gè)目錄下,并且要求它是為 原子性方式 放入的。

  • 所以一般我們不能直接把文件上傳到對(duì)應(yīng)的目錄下,因?yàn)樗蟼鞯倪^程一種在寫入一定不是 原子 ,它太慢了。
  • 所以我們把這個(gè)文件上傳到臨時(shí)目標(biāo)下,全部上傳之后然后再把文件 move 到那個(gè)目錄下。
  • 直接 move 這個(gè)動(dòng)作實(shí)際上是 原子的 ,其實(shí)對(duì)一個(gè)文件進(jìn)行 重命名 也是同一個(gè)道理

所以我們最后通過 rename 方式,就是單純的想等一切都就緒了,然后統(tǒng)一放入,更新,生效等! 和冗長的其他動(dòng)作相比,這個(gè)動(dòng)作非常輕。

到此這篇關(guān)于MySQL數(shù)據(jù)庫表的CRUD操作的文章就介紹到這了,更多相關(guān)MySQL 表CRUD操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 更改Mysql root用戶密碼

    更改Mysql root用戶密碼

    這篇文章主要介紹了更改Mysql root用戶密碼的相關(guān)資料,需要的朋友可以參考下
    2016-03-03
  • MySQL自定義序列數(shù)的實(shí)現(xiàn)方式

    MySQL自定義序列數(shù)的實(shí)現(xiàn)方式

    這篇文章主要介紹了MySQL自定義序列數(shù)的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • 將mysql腳本轉(zhuǎn)化為oracle腳本的攻略與細(xì)節(jié)點(diǎn)

    將mysql腳本轉(zhuǎn)化為oracle腳本的攻略與細(xì)節(jié)點(diǎn)

    前段時(shí)間公司項(xiàng)目數(shù)據(jù)庫需要從mysql轉(zhuǎn)為oracle,所以需要修改下原有的mysql腳本,這篇文章主要給大家介紹了關(guān)于將mysql腳本轉(zhuǎn)化為oracle腳本的攻略與細(xì)節(jié)點(diǎn),需要的朋友可以參考下
    2023-09-09
  • Mysql5.7及以上版本 ONLY_FULL_GROUP_BY報(bào)錯(cuò)的解決方法

    Mysql5.7及以上版本 ONLY_FULL_GROUP_BY報(bào)錯(cuò)的解決方法

    這篇文章主要介紹了Mysql5.7及以上版本 ONLY_FULL_GROUP_BY報(bào)錯(cuò)的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • MySql執(zhí)行流程與生命周期詳解

    MySql執(zhí)行流程與生命周期詳解

    當(dāng)你執(zhí)行一次MySQL查詢時(shí),有沒有仔細(xì)想過,在查詢結(jié)果返回之前,經(jīng)過了哪些步驟呢?這些步驟有可能消耗了超出想象的時(shí)間和資源。因此,在對(duì)MySQL的查詢進(jìn)行優(yōu)化之前,應(yīng)該了解一下MySQL查詢的生命周期
    2022-09-09
  • MySQL中的TRUNCATE()函數(shù)用法

    MySQL中的TRUNCATE()函數(shù)用法

    TRUNCATE(X,D)函數(shù)是MySQL中用于數(shù)值截取的系統(tǒng)函數(shù),其中X表示數(shù)值,D表示保留的小數(shù)位數(shù),該函數(shù)的特點(diǎn)是直接截取數(shù)值,不進(jìn)行四舍五入,根據(jù)D的不同值,操作也有所不同:D大于0時(shí),截取X的小數(shù)位;D等于0時(shí),僅保留X的整數(shù)部分;D小于0時(shí),整數(shù)部分的指定位數(shù)用0替換
    2024-10-10
  • MySQL全文索引、聯(lián)合索引、like查詢、json查詢速度哪個(gè)快

    MySQL全文索引、聯(lián)合索引、like查詢、json查詢速度哪個(gè)快

    這篇文章主要介紹了MySQL全文索引、聯(lián)合索引、like查詢、json查詢速度大比拼,通過實(shí)例代碼截圖的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Mysql中如何實(shí)現(xiàn)兩列的值互換

    Mysql中如何實(shí)現(xiàn)兩列的值互換

    這篇文章主要來和大家探討一下Mysql中如何實(shí)現(xiàn)兩列的值互換,文中為大家提供了一些常用的方法,希望對(duì)大家有一定的幫助
    2024-11-11
  • Navicat連接Mysql8.0.11出現(xiàn)1251錯(cuò)誤的解決方案

    Navicat連接Mysql8.0.11出現(xiàn)1251錯(cuò)誤的解決方案

    在重裝電腦并安裝最新版MySQL后,Navicat和Sqlyog連接MySQL時(shí)遇到的1251和2058錯(cuò)誤,通過將MySQL用戶登錄密碼加密規(guī)則從默認(rèn)的caching_sha2_password還原為mysql_native_password,問題得以解決,文章還提醒讀者在執(zhí)行命令時(shí)要注意用戶名、IP地址和密碼的正確性
    2025-11-11
  • windows下安裝MySQL詳細(xì)教程

    windows下安裝MySQL詳細(xì)教程

    這篇文章主要介紹了windows下安裝MySQL教程的相關(guān)資料,需要的朋友可以參考下
    2022-10-10

最新評(píng)論

池州市| 彩票| 岚皋县| 察雅县| 斗六市| 奉节县| 清水河县| 阆中市| 新绛县| 五寨县| 奎屯市| 宁海县| 平原县| 北碚区| 旬邑县| 深泽县| 象山县| 彭阳县| 黄大仙区| 富川| 兴化市| 秦安县| 太保市| 寿光市| 板桥市| 颍上县| 杭锦旗| 宜州市| 永定县| 博乐市| 洮南市| 色达县| 于都县| 海城市| 左贡县| 隆化县| 汉中市| 新泰市| 吴忠市| 务川| 寻甸|