1. 背景
程序出了個bug,修改時要判斷mysql某一行數據是否存在。因爲這套程序是用原生sql寫的,所以接觸到了 select 1 這樣的語句。
2. select 1 是什麼?
首先,看下面3句話:
第一個:
select 1 from h_admin_menu;
返回結果是:
第二個
# 注意下面的limit,這裏只取一行,以提高效率
select 1 from h_admin_menu where id = 72 limit 1;
返回結果是:
第三個
select 1 from h_admin_menu where id = 1772 limit 1;
返回結果是:
注意無返回值。
從作用上來說,select 1, select *, select anycol長的差不多,功能也差不多,只是返回值不同。select 1的返回值永遠是1,當然,如果有返回值的話。
效率方面:1>anycol>* 有時間可以驗證,筆者在datagrip上觀察執行時間,不過上面的執行時間不穩定,也是醉了。
下面來張圖,自行體會,瞭解下:
3. Db::query() 與 Db::execute() 的區別
第一種理解
query是查詢,execute是執行,所以當select時用query,當增加、刪除、修改時用execute再進一步
query表示查詢,返回的是表中搜索到的值;
execute表示執行,對錶中的數據是有影響的,返回的是影響的行數;所以:
場景1:
編輯保存時,如果內容未改變,仍調用update方法,返回值爲0,但此時保存是成功的。
所以判斷是否保存成功時,一般用:
if ($res !== false)
場景2
當query:
select 1 from h_admin_menu where id = 72 limit
返回值是數組那一套,如果恰巧無返回值,那麼各種判斷會讓人跳樓的。
這個時候,便可以用execute了,,因爲是受影響的行數,所以:結果只有1和0;很完美!
4. 好了,總結一下
判斷某一行數據是否存在:
$sql = "select 1 from h_admin_menu where id = 72 limit ";
$isExist = Db::execute($sql);
結束!