mysql重復記錄大于十的數據庫_面試官:在使用mysql數據庫時,遇到重復數據怎么處理?...

前言

前段時間,很多人問我能不能寫一些數據庫的文章,正好自己在測試mysql數據庫性能的時候,出現了一個問題,也就是出現了很多重復的數據,想起來自己long long ago寫過一篇類似的,僅此就拿來總結了一下。如果你在使用mysql的時候也遇到了這個問題,希望能對你有所幫助。

注意:

這篇文章不是數據庫系列的正式文章,有關mysql、MongoDB、redis、oracle等數據庫系列的文章正在整理中。

其實解決能否插入重復數據的問題,一般情況下是有兩個思路,就像治水一樣,第一個就是從源頭,第二個就是在水流經的路上。我們帶著這兩種思路繼續往下看:

問題

在我們的mysql數據庫中,經常會出現一些重復的數據,有些情況我們允許重復數據的存在,但有時候我們也需要刪除這些重復的數據。 我們如何去處理呢?

方法一:防止出現重復數據

也就是說我們再設計表的時候,就應該對這些數據設置一個UNIQUE 索引,在插入的時候就可以保證其唯一性,也就不存在有重復的數據了。當然你也可以直接設置為PRIMARY KEY(主鍵)。效果也是一樣的。

我們看一個案例:下表中無索引及主鍵,所以該表允許出現多條重復記錄。

CREATE TABLE student

(

first_name CHAR(20),

last_name CHAR(20),

sex CHAR(10)

);

目前first_name,last_name是可以重復的,如果不想重復這里有兩個解決辦法:

1、設置雙主鍵模式

CREATE TABLE student

(

first_name CHAR(20) NOT NULL,

last_name CHAR(20) NOT NULL,

sex CHAR(10),

PRIMARY KEY (last_name, first_name)

);

現在就無法插入重復數據了。

2、添加unique索引

CREATE TABLE student

(

first_name CHAR(20) NOT NULL,

last_name CHAR(20) NOT NULL,

sex CHAR(10)

UNIQUE (last_name, first_name)

);

這兩種看起來形式好像有一點區別,但是能起到相同的作用。此時我們可以插入兩條重復的數據,會發現報錯。

當然我們還可以在數據庫中去驗證一下:

SELECT COUNT(*) as repetitions, last_name, first_name

FROM student

GROUP BY last_name, first_name

HAVING repetitions > 1;

在這里我們統計的是 first_name 和 last_name的重復記錄數,上面已經用兩種方法設置了,這里肯定就是0了。

方法二:在插入時指定能否插入重復數據

在這里我們使用的是Insert ignore into 與Insert into指令。

(1)Insert ignore into會忽略數據庫中已經存在的數據,如果數據庫沒有數據,就插入新的數據,如果有數據的話就跳過這條數據。這樣就可以保留數據庫中已經存在數據,達到在間隙中插入數據的目的。

(2)Insert into則直接相反,會直接插入數據,不管數據庫里面是否含有重復數據。

我們還是舉例說明:

insert ignore into student (last_name, first_name) values ( '張三', '李四');

//結果

Query OK, 1 rows affected (0.00 sec)

insert ignore into student (last_name, first_name) values ( '張三', '李四');

//結果

Query OK, 0 rows affected (0.00 sec)

現在我們看出來了吧,也就是說在執行第一條插入操作的時候,看到數據庫沒有,則直接插入一條新紀錄,因此一行記錄受到影響,但是在第二次插入的時候,數據庫已經有一條一樣的了,因此便不會插入了,0行受到影響。

當然了還有一個指令也可以完成類似于insert ignore into相似的功能,那就是replace into。他表示的是如果存在primary 或 unique相同的記錄,則先刪除掉。再插入新記錄。

方法三:過濾重復數據

如果你需要讀取不重復的數據可以在 SELECT 語句中使用 DISTINCT 關鍵字來過濾重復數據。

SELECT DISTINCT last_name, first_name

FROM student

ORDER BY last_name;

你也可以使用 GROUP BY 來讀取數據表中不重復的數據:

SELECT last_name, first_name

FROM student

GROUP BY (last_name, first_name);

方法四:刪除重復數據

這種情況其實就相當于,在水的終點處去解決。看下面sql語句:

//根據student創建一個臨時表,并使用group by過濾了重復數據

CREATE TABLE tmp SELECT last_name, first_name, sex

FROM student;

GROUP BY (last_name, first_name);

//刪除原student表

DROP TABLE student;

//給這個臨時表重新命名

ALTER TABLE tmp RENAME TO stu;

當然你也可以在數據表中添加 INDEX(索引) 和 PRIMAY KEY(主鍵)這種簡單的方法來刪除表中的重復記錄。方法如下:

ALTER IGNORE TABLE student

ADD PRIMARY KEY (last_name, first_name);

OK,解決辦法這么多,相信能解決你的問題。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/530342.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/530342.shtml
英文地址,請注明出處:http://en.pswp.cn/news/530342.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

線程組的概念

一,線程組和線程的結構:樹形結構 每個Thread必然存在于一個ThreadGroup中,Thread不能獨立于ThreadGroup存在。 執行main()方法線程的名字是main 如果在new Thread時沒有顯式指定,那么默認將父線程(當前執行new Threa…

mysql中ak替換鍵_數據庫:唯一性約束_alternate key(替換鍵) mySQL Oracle 數據庫 ak 唯一性約束...

數據庫:唯一性約束_alternate key(替換鍵) mySQL Oracle 數據庫 ak 唯一性約束數據庫:唯一性約束所謂唯一性約束(unique constraint)不過是數據表內替代鍵的另一個名稱而已。替代鍵(alternate key)可以是數據表內不作為主鍵的其他任何列,只要該鍵對該數據表唯一即可…

Oracle自定義類型

Oracle自定義類型可以通過type/create type來聲明或者創建 一,四種創建方式 1.1,使用create type創建object類型 create or replace type obj_type as object(id number,name varchar2(50 byte),birthday date); 1.2,使用create type創建…

Oracle/mysql查詢語句的執行過程

執行順序 from on join/pivot/unpivot(mysql沒有pivot和unpivot) where group by having select distinct order by limit&#xff08;oralce沒有&#xff09; 書寫順序 select distinct <select_list> from <left_table> <join_type>join <righ…

mysql定時sql腳本_定時執行的SQL腳本

因為要同步一個表&#xff0c;所以每天要同步一次數據&#xff0c;但是對SQL不是精通的我&#xff0c;為了測試寫了一段代碼來測試定時功能創建一個存儲過程&#xff0c;是用來插數據的&#xff0c;沒有輸出和輸出參數create or replace procedure temp_pro asbegininsert into…

mysql xml語句_Mysql語句

xml文件轉義字符處理(1)(2)直接寫轉義后的字符1、mysql里批量修改表內某個字段內的部分數據UPDATE inventory_stockSET batchno REPLACE(batchno,-20-201901,-50-2019)2、ON DUPLICATE KEY UPDATE根據主鍵判斷是新增還是修改(也可以有兩個或多個主鍵)INSERT INTO TABLE (a,c) …

destoon網站mysql分表_destoon : 常用數據庫操作

destoon在初始化系統后系統會自動連接數據庫&#xff0c;并將數據庫操作對象保存在$db。對于數據庫操作方法參考include/db_mysql.class.php函數原型&#xff0c;我來寫幾個常用數據庫操作。1、讀取單條信息$S $db->get_one("SELECT * FROM {$DT_PRE}table WHERE xxxy…

delphi7 mysql控件_Delphi7連接MySql數據庫-DBGrid控件顯示數據

一個簡單的Delphi7小程序&#xff0c;使用MySql數據庫做簡單查詢&#xff0c;用DBGrid控件顯示結果&#xff0c;實現過程如下&#xff1a;(1)在MySql中新建demouser表&#xff0c;插入記錄用于測試。(2)在Delphi7中新建項目。(3)在From中添加組件。組件Panel&#xff1a;pnl1組…

for循環false 終止 python_python3.5.1給用戶3次無效的嘗試,然后終止pgm(Simple FOR循環)...

我需要幫助(新生-2周)。我想得到這段代碼可能的最微小的變化&#xff0c;允許用戶3次在程序中輸入錯誤的值。輸入錯誤值3次后&#xff0c;程序應終止。唯一的要求是代碼必須包含FOR循環。我不知道它是需要一個FOR循環還是3個FOR循環(每次轉換一個)。我嘗試了很多種方案&#xf…

mysql何時會走索引

訪問類型&#xff0c;這里只列出最常見的6種類型 all,index,range,ref,eq_ref&#xff0c;const mysql中explain的type的解釋_dennis211的博客-CSDN博客_explain type 使用不同的運算符時訪問類型不一樣&#xff1a; !、not in、<>、>、<、in(多個值)、or、bet…

mysql數據庫唯一性_在MySQL數據庫中添加唯一性約束,范圍可能嗎?

我有一個使用MySQL的Rails應用程序。我在兩個模型之間有一個has_many :through關聯&#xff0c;如下所述&#xff1a;class Category < ActiveRecord::Basehas_many :category_pairingshas_many :dishes, through: :category_pairings, :inverse_of > :categoriesendclas…

filtic函數 matlab_matlab filtic 函數應用 filter 解差分方程 dft 函數

matlab filtic 函數應用 filter 解差分方程 dft 函數一、 解差分方程說明都在代碼注釋里面了%這里要利用filtic函數 為濾波器的直接II型實現選擇初始條件%求解查分方程 y(n) - 0.4y(n-1) - 0.45y(n-2) 0.45x(n) 0.4x(n-1) - x(n-2)%y(-1) 0 y(-2) 1 x(-1) 1 x(-2) 2%x(n)…

rabbitmq進階一

上一篇文章有講到rabbitmq的安裝、web管理端和springboot簡單集成rabbitmq 本文重點介紹rabbitmq相關api的使用 按照官網常用的五種模式的順序&#xff1a;HelloWorld、Work queues、Publish/Subscribe、Routing、Topics 模式簡單介紹 HelloWorld 一個生產者&#xff0c;一…

mysql 相關搜索_MySQL單詞搜索相關度排名

一個單詞搜索的相關度排名,這個例子演示了一個單詞搜索的相關度排名計算。mysql> CREATE TABLE articles (-> id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,-> title VARCHAR(200),-> body TEXT,-> FULLTEXT (title,body)-> ) ENGINEInnoDB;Query O…

IDEA使用總結

idea中使用tomcat IntelliJ IDEA配置Tomcat&#xff08;完整版圖文教程&#xff09;_猿Bug的博客-CSDN博客_intellij tomcat配置 用上面的方式發現缺少文件&#xff0c;在edit configuration頁面選擇before lanuch前選擇Run maven goal package

mysql一直copying to tmp table_mysql提示Copying to tmp table on disk

網站運行的慢了&#xff0c;查找原因是Copying to tmp table on disk那怎么解決這個問題呢解決一例最近常常碰到網站慢的情況&#xff0c;登陸到后臺&#xff0c;查詢一下 /opt/mysql/bin/mysqladmin processlist;發現一個查詢狀態為&#xff1a; Copying to tmp table 而且此查…

idea cloud bootstrap是啥_application.yml與bootstrap.yml的區別

Spring Boot 默認支持 properties(.properties) 和 YAML(.yml .yaml ) 兩種格式的配置文件&#xff0c;yml 和 properties 文件都屬于配置文件&#xff0c;功能一樣。Spring Cloud 構建于 Spring Boot 之上&#xff0c;在 Spring Boot 中有兩種上下文&#xff0c;一種是 bootst…

python讀取日期_從文件中讀取日期和數據(Python)

我想從文件中讀取時間字符串和數據&#xff0c;但是當我使用loadtxt時&#xff0c;我不能同時讀取字符串和數字&#xff0c;因為字符串不是浮點型的。所以我嘗試使用genfromtxt并使用delimiter[][][]作為我所擁有的列&#xff0c;但是字符串的讀起來像nan。我希望像時間數組(da…

一個小白如何創建MYSQL數據表_MySQL小白掃盲(二)--建表、添加、查詢

1.SELECT子句字句名稱          使用目的select           確定結果集中應該包含哪些列from           指明所要提取數據的表&#xff0c;以及這些表示如何連接的where           過濾掉不需要的數據group by         用于…

元數據解決分表不可 mysql_MySQL InnoDB技術內幕:內存管理、事務和鎖

前面有多篇文章介紹過MySQL InnoDB的相關知識&#xff0c;今天我們要更深入一些&#xff0c;看看它們的內部原理和機制是如何實現的。一、內存管理我們知道&#xff0c;MySQl是一個存儲系統&#xff0c;數據最后都寫在磁盤上。我們以前也提到過&#xff0c;磁盤的速度特別是大容…