mysql计算后精度增大_Mysql用法汇总
mysql用法總結及整理
1、group by …HAVING 獲取分組大于某個總數的的前多少位
SELECT user_id, count(*) as total FROM `blog_index_tbl` WHERE add_time BETWEEN UNIX_TIMESTAMP('2016-01-01 00:00:00') AND UNIX_TIMESTAMP('2016-12-31 23:59:59') GROUP BY user_id HAVING total > 1 ORDER BY total DESC;
最近研發的項目對DB依賴比較重,梳理了這段時間使用MySQL遇到的8個比較具有代表性的問題,答案也比較偏自己的開發實踐,沒有DBA專業和深入,有出入的請使勁拍磚!…
MySQL讀寫性能是多少,有哪些性能相關的配置參數?
MySQL負載高時,如何找到是由哪些SQL引起的?
如何針對具體的SQL做優化?
SQL層面已難以優化,請求量繼續增大時的應對策略?
MySQL如何做主從數據同步?
如何防止DB誤操作和做好容災?
該選擇MySQL哪種存儲引擎,Innodb具有什么特性?
MySQL內部結構有哪些層次?
3、MySQL表復制
復制表結構+復制表數據
mysql> create table t3 like t1;
mysql> INSERT INTO t3 SELECT * t1;
注意:如果需要把表中的某一個字段拷貝到另一個表中對應的字段處,就可以使用相應的字段。
4、MySQL事務處理
MyIsam 引擎不支持事務處理,必須使用 innoDB
然后進行 commit 命令提交,數據才能被真正刪除,否則該操作會鎖行,其他的不能進行操作。
1、關閉自動提交功能:
SET autocommit=0;
2、刪除id為1的用戶:
DELETE FROM test_tbl WHERE id=1;
3、在表界面手動刪除id=1的用戶
在開啟事務的情況下,另一個用戶在表界面手動刪除id=1的用戶,會出現鎖行的情況出現
4、提交事務后,刪除的數據才會被從表中真正的刪除。
commit
綜上,如果有事務,則其他操作會被鎖行,等到事務提交后,才能對鎖行的進行編輯、刪除操作。
關于事務的一篇文章,大家可以看看:
MySQL默認操作模式就是 autocommit 自動提交模式。這就表示除非顯式地開始一個事務,否則每個查詢都被當做一個單獨的事務自動執行。我們可以通過設置autocommit的值改變是否是自動提交autocommit模式。
通過以下命令可以查看當前autocommit模式
mysql> show variables like ‘autocommit’;
Variable_name
Value
autocommit
ON
1 row in set (0.04 sec)
從查詢結果中,我們發現Value的值是ON,表示autocommit開啟。我們可以通過以下SQL語句改變這個模式
mysql> set autocommit = 0;
值0和OFF都是一樣的,當然,1也就表示ON。通過以上設置autocommit=0,則用戶將一直處于某個事務中,直到執行一條commit提交或rollback語句才會結束當前事務重新開始一個新的事務。
舉個例子:
張三給李四轉賬500元。那么在數據庫中應該是以下操作:
1,先查詢張三的賬戶余額是否足夠
2,張三的賬戶上減去500元
3,李四的賬戶上加上500元
以上三個步驟就可以放在一個事務中執行提交,要么全部執行要么全部不執行,如果一切都OK就commit提交永久性更改數據;如果出錯則rollback回滾到更改前的狀態。
利用事務處理就不會出現張三的錢少了李四的賬戶卻沒有增加500元或者張三的錢沒有減去李四的賬戶卻加了500元。
MySQL默認的存儲引擎是MyISAM,MyISAM存儲引擎不支持事務處理,所以改變autocommit沒有什么作用。但不會報錯,所以要使用事務處理的童鞋一定要確定你所操作的表示支持事務處理的,如InnoDB。如果不知道表的存儲引擎可以通過查看建表語句查看建表的時候有沒有指定事務類型的存儲引擎,如果沒有指定存儲引擎默認則是MyISAM不支持事務的存儲引擎。
當然,事務處理是為了保障表數據原子性、一致性、隔離性、持久性。這些都是要消耗系統資源的,要謹慎選擇。
php中使用事物實例
$state = 0;
// 添加事物處理
try {
// 開啟事物
$GLOBALS['db']->beginTransaction();
// 更新管理平臺密碼
$state = $GLOBALS['db']->query("update admin_user set password='$password_confirm' where user_id=$user_id");
if($state != true)
{
throw new Exception ('更新管理平臺密碼失敗!');
}
$ret = $this->modify_ldap_pwd($user_name, $user_password_old, $user_password_confirm);
if(!$ret)
{
throw new Exception ('更新LDAP密碼失敗!');
}
// 提交事物
$GLOBALS['db']->commit();
$state = 1;
}
catch (Exception $e)
{
// 回滾
$GLOBALS['db']->rollBack();
}
4、MySQL表外鍵
一個表的外鍵必定是另外一個表的主鍵,只有innodB支持外鍵和事務處理。
5、刪除表數據主鍵從1開始
在數據庫應用,我們經常要用到唯一編號,以標識記錄。在MySQL中可通過數據列的AUTO_INCREMENT屬性來自動生成。mysql支持多種數據表,每種數據表的自增屬性都有差異,這里將介紹各種數據表里的數據列自增屬性。
數據庫中設置了自增列,有時候需要清楚數據庫從新錄入數據.最常見的做法就是使用sql語句”delete 表明名”或是直接選中數據,然后刪除數據.但是再次插入數據的時候,你就會發現自增列會從上次刪除數據的最大值的下一個值開始,而不是從1開始的.有沒有一種感覺,感覺挺苦惱的.
現在就交你一種方法,讓你刪除數據后,再次插入記錄的時候,自增列從1開始.
truncate table 你的表名 // 這樣不但將數據全部刪除,而且重新定位自增的字段
truncate table `goods_tbl`;
mysql 小數點精度問題
今天在設計數據表時,突然發現原來FLOAT是很不靠譜的,所以在這里建議大家換成DOUBLE類型,
原因是:
在mysql手冊中講到,在MySQL中的所有計算都是使用雙精度完成的,使用float(單精度)會有誤差,出現意想不到的結果。
在我們查詢數據時,MySQL使用64位十進制數值的精度執行DECIMAL操作,float(5.54) = 5.54 如果出現精度丟失,這個是不等的。這樣,本來我們應該能查到的數據就會莫名其妙的消失。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的mysql计算后精度增大_Mysql用法汇总的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python读文件缺key_在Pytho
- 下一篇: 导出mysql sql语句吗_mysql