mysql 常見的坑 用MySQL碰到的一些「坑」

2021-10-17 20:17:18 字數 1835 閱讀 5500

本篇文章持續更新。

這裡說坑,也不算坑,只是對我乙個經常用sql server的來說有點不習慣而已。

一、groupby 的不同

create tablecustomer (

customernumbervarchar(50),

paymentdatedatetime,

amountint)insert intocustomer(

customernumber,

paymentdate,

amount

)select '103','2018-01-02','123.01' union all

select '103','2018-01-08','123.01' union all

select '115','2018-01-04','123.01' union all

select '112','2018-01-05','123.01' union all

select '115','2018-01-08','123.01' union all

select '112','2018-01-10','123.01' union all

select '114','2018-01-06','123.01' ;

根據上面的資料,我們執行如下sql語句:

select customernumber,paymentdate from  customer group by customernumber

第一反應,看到這條sql,我說這不是會報錯嗎(按照以前在sqlserver的邏輯)。

實際上是不會報錯的。

真正的原因:mysql裡面是通過sql_model來提供sql語句的合法檢查,在mysql的sql_model=default的情況下

是允許剛剛上面這種做法的,也就是說一條select語句,除了聚合函式和group by column以外的表示式(這個表示式的值無法確定)

實際上是mysql的分組內第一行對應列的值)

而很多對語義限制比較嚴的多家資料庫,如sqlserver,oracle,postgresql都不支援select trage list **現語義不明確的列。

所以mysql在後續的版本**現了乙個修正的語義,也就是我們說的only_full_group_by的語義。

set sql_mode=only_full_group_by;select customernumber,paymentdate from customer group by customernumber;

上面這樣寫就會報錯:說paymentdate不在group by 的列中。

不管我們是否設定:

set sql_mode=only_full_group_by

我們都應該按照嚴格的語義來寫,不然給後面維護帶來不方便。

二、刪除資料

一開始的刪除資料,直接寫了下面個子查詢,然後就交給dba,去正式的庫執行,之後反饋說,報錯了,不能執行。

delete fromcustomerwhere customernumber in(select customernumber frompayments

上面這個做法為什麼錯呢,因為mysql不允許在安全模式下,刪除資料不通過主鍵來刪除。

正確的做法:

把安全更新設定為零,用完再設定回1。

set sql_safe_updates = 0;delete fromcustomerwhere customernumber in(select customernumber frompayments

);set sql_safe_updates=1;

從這裡也可以看出,我們進行刪除資料這些操作,還是盡量的用主鍵好。主鍵能夠保證不會多刪,並且效率也高。

mysql 常見的坑 常見的Mysql踩坑區

為了看的明顯,我們先建立乙個表測試一下 create table student id int 11 not null,name varchar 20 default null,age int 11 default null,primary key id engine innodb default ...

mysql 坑 mysql入過的坑

前言 前段時間由於工作需要,部署乙個新的專案。需要安裝mysql,因此遇到不少坑。首先是啟動的時候遇到找不到檔案位置的問題,在網上找了下原因,是由於之前安裝了mysql解除安裝的時候沒有解除安裝乾淨有殘留導致的。需要進入登錄檔cmd regedit hkey local machine system...

mysql常見的優化策略 Mysql常見的優化策略

資料庫設計方面優化 1 資料庫設計符合第三正規化,為了查詢方便可以有一定的資料冗餘。2 選擇資料型別優先順序 int date,time enum,char varchar blob,選擇資料型別時,可以考慮替換,如ip位址可以用ip2long 函式轉換為unsign int型來進行儲存。3 對於c...