作者 主題: 請教一個取得目前資料庫中的auto_increment的值  (閱讀 4416 次)

0 會員 與 1 訪客 正在閱讀本文。

ievson

  • 憂鬱的高中生
  • ***
  • 文章數: 92
    • 檢視個人資料
小弟找到了php有這個東西可以用mysql_insert_id
但跟我要的有出入,它是在insert完之後才取得
但小弟想要在insert前先取得目前的最大值
因為新的insert要順便把最大值給塞進來如下
insert abc (auto,name,code) value (2,abc,2);
我想在這個sql被執行前先取得,然後把它加一再塞到新的sql之後再mysql_query(sql);
為什麼有這麼奇怪的需求因為假設我有2筆資料被刪了一筆之後,再新增一筆
流水號會變成3,然後code這個我原本是先找出目前最大的流水號加一
不過如果使用者刪了一筆之後再新增一筆,code則會變成2
因為刪了一筆後,最大流水號是1,再加1之後就變成了2
但我希望是3,簡單講就是code這個欄位要與流水號是一樣的...
這麼奇怪的需求有可能達到嗎?

jaceju

  • 憂鬱的高中生
  • ***
  • 文章數: 106
    • 檢視個人資料
請教一個取得目前資料庫中的auto_increment的值
« 回覆 #1 於: 2007-08-15 16:30 »
那為什麼不先 Insert 完再 Update ?

fillano

  • 鑽研的研究生
  • *****
  • 文章數: 526
    • 檢視個人資料
請教一個取得目前資料庫中的auto_increment的值
« 回覆 #2 於: 2007-08-15 16:35 »
如果只是要code==auto的話,那就先insert(auto的值為0),然後透過insert_id取得auto,再update table把insert_id塞給code。

例如,假設我資料表用以下的schemas:
代碼: [選擇]

create table abc (
auto int not null auto_increment,
name varchar(255) not null default '',
code int not null default 0,
primary key auto);

這樣,就可以利用到mysql_insert_id的好處:
代碼: [選擇]

$sql = "insert into abc (auto,name) values (0,'name1')";
mysql_query($sql);
$auto = mysql_insert_id();
$sql = "update abc set code=$auto where auto=$auto";
mysql_query($sql);

通常我是這樣做的。

自己維護會有風險,就是碰到racing condition,例如有很多人在同時使用同一支程式,還是讓mysql來維護sequence比較好。
Sapere aude! Habe Mut, dich deines eigenen Verstandes zu bedienen! ist also der Wahlspruch der Aufklärung.

SunsetKiller

  • 可愛的小學生
  • *
  • 文章數: 10
    • 檢視個人資料
    • 阿宅
引述: "ievson"

這麼奇怪的需求有可能達到嗎?


沒試過這類的用法.

不過依小弟當下的邏輯先幫你想了一下.

先取出最新的一筆資料(用auto_increment欄位做排序)
把取出新一筆的所有資料取出.

例: 資料表 有3個欄位
代碼: [選擇]
id ( auto_increment )
detal ( text )
author ( char )


代碼: [選擇]
select id from 資料表 order by id desc limit 0,1
用id欄位排序, desc是由大往小排序, limit 限制取第1筆.

這樣就得到 auto_increment欄位的值 (這個值就是最大值)

詳細的語法應該不用po出來吧.  :D

marlboro1984

  • 懷疑的國中生
  • **
  • 文章數: 65
    • 檢視個人資料
請教一個取得目前資料庫中的auto_increment的值
« 回覆 #4 於: 2007-08-17 20:44 »
了解了!謝謝各位的講解!