Mysql - 增刪改

来源:http://www.cnblogs.com/elvinle/archive/2016/12/23/6213889.html
-Advertisement-
Play Games

因為項目原因, mysql用了兩年了, 但是一直都未曾去總結過. 最近也是領導讓總結項目, 才想起把mysql的使用小結一下. 一、 Create 1. 單條插入, sql格式: insert into (列名) values(列值); 對於自增的 Id, 是不需要寫的, 資料庫會自動生成, 但是如 ...


因為項目原因, mysql用了兩年了, 但是一直都未曾去總結過. 最近也是領導讓總結項目, 才想起把mysql的使用小結一下.

一、 Create

1. 單條插入, sql格式: insert into (列名) values(列值);

INSERT INTO test.tch_teacher (  Sex, BId, NO, NAME, IsDoublePosition, CreateDate )
VALUES (  1, '123123123', '123123123', 'Insert', 0, NOW() );

對於自增的 Id, 是不需要寫的, 資料庫會自動生成, 但是如果一不小心寫上去了, 只要你的Id值, 在資料庫中不存在, 是可以插入進去的.

在mysql中, 就算你插入的 id 為負數, 也是可以插入成功的. 如果資料庫中已存在你想插入的 id 值, 則會直接報錯.

 

2. 多條插入, sql格式: insert into (列名) values(列值),(列值),(列值);

INSERT INTO test.tch_teacher (  Sex, BId, NO, NAME, IsDoublePosition, CreateDate ) 
VALUES 
( 2, '123123123', '123123123', 'Insert', 0, NOW() ),
( 3, '123123123', '123123123', 'Insert', 0, NOW() ),
( 4, '123123123', '123123123', 'Insert', 0, NOW() );

新增多條的時候, 也可以迴圈調用單條插入語句去插入, 不過, 這種方式並不推薦使用, 因為, 這種方式, 消費更多性能和時間.

 

3. 表插入

可以新建一張臨時表: tch_teacher_temp

CREATE TABLE `tch_teacher_temp` (
  `Sex` smallint(6) DEFAULT NULL,
  `BId` varchar(36) CHARACTER SET utf8 DEFAULT NULL,
  `No` varchar(20) CHARACTER SET utf8 DEFAULT NULL,
  `Name` varchar(30) CHARACTER SET utf8 DEFAULT NULL,
  `IsDoublePosition` bit(1) DEFAULT NULL,
  `CreateDate` datetime DEFAULT NULL,
  PRIMARY KEY (`Id`)
) 

這裡有一個取巧的方式, 來獲取建表sql

show create table tch_teacher;

然後修改一下表名,刪除主鍵(也可不刪)就可以了.

insert into tch_teacher (Sex, BId, NO, NAME, IsDoublePosition, CreateDate) 
select * from tch_teacher_temp;
-- 或者
insert into tch_teacher (Sex, BId, NO, NAME, IsDoublePosition, CreateDate) 
select Sex, BId, NO, NAME, IsDoublePosition, CreateDate from tch_teacher_temp;

 

4. 性能比較

我粗略測試了一下, 十萬級和百萬級的數據量, 插入1000條數據. tch_teacher表, 我建了三個索引:Sex, BId, IsDoublePosition

1). 不使用事務, 一條一條插入, 迴圈以下這條語句, 1000次

for (int i = 0; i < 1000; i++)
{
    var param = new { BId = Guid.NewGuid(), Name = names[ran.Next(9)] + names[ran.Next(9)] + i, IsDoublePosition = i % 2, CreateDate = DateTime.Now, Sex = i % 2, No = ran.Next(100000, 9999999) };
    conn.Execute(insertSql, param);
}

 

2). 在使用事務的情況下,  還是迴圈這條語句, 不同的是, 在迴圈結束處, 加入事務提交(這次的插入是在上次的數據量基礎上, 也就是說, 這次插入前, 數據比上次多1000條)

var tran = conn.BeginTransaction();
for (int i = 0; i < 1000; i++)
{
    var param = new { BId = Guid.NewGuid(), Name = names[ran.Next(9)] + names[ran.Next(9)] + i, IsDoublePosition = i % 2, CreateDate = DateTime.Now, Sex = i % 2, No = ran.Next(100000, 9999999) };
    conn.Execute(insertSql, param, tran);
}
tran.Commit();

 

3). 拼接sql語句的情況下, 由於是"(),(),();"格式的, 所以參數我全做入sql中了, 這裡參數化的方式, 不好做. (這次的插入也是在上次的數據量基礎上, 也就是說, 這次插入前, 數據比上次多1000條)

StringBuilder sb = new StringBuilder("insert into tch_teacher(BId,Sex,No, Name, IsDoublePosition, CreateDate) values ", 10000);
for (int i = 0; i < 1000; i++)
{
    sb.Append(string.Format("('{0}', {1}, '{2}', '{3}', {4}, '{5}'),",
        Guid.NewGuid(),
            i % 2,
            ran.Next(100000, 9999999),
        names[ran.Next(9)] + names[ran.Next(9)] + i,
        i % 2,
        DateTime.Now.ToString("yyyy-MM-dd")));
}
sb.Remove(sb.Length - 1, 1);
conn.Execute(sb.ToString());

這種方式, 有兩個不好的地方, 一個是不能參數化, 另一個是如果插入數據較多, 會導致sql語句太長, 所以並不推薦

 

4). 建臨時表的方式, 這裡我是事先吧臨時表建好的, 在代碼裡面就沒有建了

var insertSql = @"insert into tch_teacher_temp(BId,Sex,No, Name, IsDoublePosition, CreateDate) values(@BId, @Sex, @No, @Name, @IsDoublePosition, @CreateDate);";
var tran = conn.BeginTransaction();
for (int i = 0; i < 1000; i++)
{
    var param = new { BId = Guid.NewGuid(), Name = names[ran.Next(9)] + names[ran.Next(9)] + i, IsDoublePosition = i % 2, CreateDate = DateTime.Now, Sex = i % 2, No = ran.Next(100000, 9999999) };
    conn.Execute(insertSql, param, tran);
}
conn.Execute(@"insert into tch_teacher (Sex, BId, NO, NAME, IsDoublePosition, CreateDate) select Sex, BId, NO, NAME, IsDoublePosition, CreateDate from tch_teacher_temp;", null, tran1);
tran.Commit();

這種方式, 每次都要新建表, 刪除表. 也是挺麻煩的, 這裡的測試, 就沒有包含新建表和刪除表了

 

結果:

                     十萬(ms)              百萬(ms)

sql拼接           230                      359

事務提交         412                      511

臨時表            661                     1424

一條一條       27606                   36620

 

除了一條一條提交方式, 其他的在時間上, 還是能接受的, 但是推薦使用第2種, 事務提交方式, 易用, 清晰, 省事.

 

二、Delete

刪除就相對簡單多了. 刪除sql的格式: delete from 表名 where 條件

刪除的時候, 如果不加where條件, 就是刪除整張表的數據, 相當於 where 1=1 ;

delete from tch_teacher where id=1;

這是一條最簡單的語句了.

刪除的時候, 對於主鍵的自增沒有影響. 比如主鍵為 1,2,3

這時候刪除了3, 再插入一條數據, 主鍵為從4開始.

如果想要讓主鍵又從1開始的話, 需要使用truncate

truncate table tch_teacher ;

這樣, 表回歸初始狀態.

有時候, 通過where查找後, 能得出很多條數據, 但是我只想刪除其中的前幾條, 那怎麼辦呢. 有辦法

delete from tch_teacher where isDoublePosition=1 order by id limit 6;

這條語句, 就是刪除 滿足條件的, 前6條數據

 

三、Update

sql格式: update 表名  set 列=值 where 條件

update的where條件也是可以不加的, 不加的情況下, 修改的就是全部數據.

update tch_teacher set name='黑茶' where id=3;

修改的時候, 也是可以通過連表的方式, 去修改數據的.

update  tch_teacher , tch_contact set tch_teacher.`Name`='紅茶' where tch_teacher.Id=tch_contact.TId and tch_contact.Id=1003;

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Spark是現在應用最廣泛的分散式計算框架,oozie支持在它的調度中執行spark。在我的日常工作中,一部分工作就是基於oozie維護好每天的spark離線任務,合理的設計工作流並分配適合的參數對於spark的穩定運行十分重要。 Spark Action 這個Action允許執行spark任務,需 ...
  • 想安裝當然要先有一個MySql的安裝包 這裡使用的是mysql-5.7.12-winx64 安裝包百度雲:http://pan.baidu.com/s/1kVAuXuv 密碼:hr39 1.要將壓縮包解壓到你的指定位置(最好將要用的工具文件分類放好) 例如:D:\javaApp\mysql-5.7. ...
  • 【轉自網路】https://my.oschina.net/cers/blog/292191 PK Belongs to primary key 作為主鍵 NN Not Null 非空 UQ Unique index 不能重覆 BIN Is binary column 存放二進位數據的列 UN Uns ...
  • 分析: 資料庫設計應遵循三大範式分別為: 第一範式:確保表中每列的原子性(不可拆分); 第二範式:確保表中每列與主鍵相關,而不能只與主鍵的某部分相關(主要針對聯合主鍵),主鍵列與非主鍵列遵循完全函數依賴關係(完全依賴); 第三範式:非主鍵列之間沒有傳遞函數依賴關係(消除傳遞依賴); 詳述: 第一範式 ...
  • Took me a while to suffer from the first successful souce code installation of mysql-5.6.34. Just put it here and share it with u. Env.OS:Red Hat Ente ...
  • 在最開始階段,我們進行初始數據的收集工作,根據不同的業務場景,可能會涉及到的一些技術領域:分散日誌收集技術,諸如Scribe、Flume為代表的開源日誌收集系統;數據消息傳遞相關的技術,各種開源的消息隊列MQ,諸如ActiveMQ、RocketMQ、Kafka等;各種爬蟲技術、網頁解析技術;資料庫數 ...
  • ClearTrace 能幹啥 當我們的資料庫伺服器在某段業務高峰年期間,周期性出現如CPU接近 100%、記憶體耗盡、IO量大等問題時候,作為維護人員這時候壓力很大,在做一般性排除後仍然沒有找到原因。當我們需要進一步深入到語句分析層面找問題根源時,ClearTrace這款工具正好可以幫上忙。 通過該工 ...
  • 前幾天,一臺Oracle資料庫(Oracle Database 10g Release 10.2.0.4.0 - 64bit Production)監控出現"PMON failed to acquire latch, see PMON dump"錯誤,連接資料庫出現短暫異常,告警日誌中具體錯誤如下所... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...