㈠ 資料庫的流水號是什麼
資料庫的流水號 就相當於一個自增的整數,用來識別唯一的記錄用的。也就是說你每插入一條記錄,流水號就增加1.
一般是 日期+流水號 形成一個唯一的id。
㈡ 資料庫表中的主鍵有的是流水號,這個是怎麼生成的
有什麼要求嗎?
一般有:
自增長列(對於oracle來說,用序列sequence來實現)
最大號 + 1
年月日 + 序號 -- 這兒的序號,就是上面的最大號+1,但是實現方法可能稍有區別
㈢ 怎麼生成流水號
目前是在.net中使用的這個方法,使用sqlserver的時間戳來控制並發情況下容易產生重復序列號的問題。
原理類似hibernate的主鍵生成機制,在系統啟動時從資料庫中讀出最大的流水號,賦給一個類的靜態變數,需要時,從該靜態變數中取得流水號,加1後,就是你要的值。
代碼:
public class testA {
public static Long maxNo;
static {
synchronized(maxNo){
maxNo = select max(maxNo) from DB;
}
}
public synchronized static long getMaxNo(){
return(++maxNo);
}
}
優點:保證同步,不會取到相同的值,同時避免了資料庫的反復讀取。
缺點:在cluster環境下
還是用上面的方法,但是只能在一台機器上發布並且綁定到JNDI,別的機器可以通過配置文件得知去哪裡產生maxNo(實際上,每台機器都可以發布,但是所有機器只能去訪問指定的一台機器),這樣的效率雖然低了點,但是還是覺得比每次去資料庫里取好點。當然,可以改進,就是再加一個本地類,每次去JNDI那裡的類去取數據時,一次取20個回來(就是JNDI上面的類一次要加20),以後本地就用這20個值,用完了,再去JNDI上面的類去取。
當然,前面的這兩個例子都比較復雜,甚至還有人提出用單態的方法。而我在.net中用的就比較簡單了。方法如下:
在資料庫(sqlserver)中新建一張表(sequence_num),專門用來生成流水號。
欄位1:s_id,varchar(50),notnull
欄位2:tmstmp,timestamp,notnull
代碼如下:
public string getOderid()
{
private SqlConnection conn = null;
private SqlCommand comm = null;
private string s_id = "";
private byte [] tmstmp;//時間戳類型在.net中對應為一個byte數組
private int s_idplus = 0;
private string orderid = "";
try
{
conn = SqlConn.getConn();
conn.Open();
do
{
string sqlQuery = "select s_id,tmstmp as tmstmp from sequence_num";
comm = conn.CreateCommand();
comm.CommandText = sqlQuery;
SqlDataAdapter da = new SqlDataAdapter(comm);
DataTable dt = new DataTable();
dt.Clear();
da.Fill(dt);
comm.Parameters.Clear();
if (!dt.Rows[0]["s_id"].ToString().Substring(0,12).Equals(DateTime.Now.ToString("yyyyMMddHHmm")))//每一分鍾重置一次計數,實際上我認為每天重置一次比較好
{
s_id = DateTime.Now.ToString("yyyyMMddHHmm")+"0001";
tmstmp = (byte[])dt.Rows[0]["tmstmp"];
}
else
{
s_id = dt.Rows[0]["s_id"].ToString();
tmstmp = (byte[])dt.Rows[0]["tmstmp"];
s_idplus = Convert.ToInt32(s_id.Substring(12)) + 1;
s_id = s_id.Substring(0,12)+Convert.ToString(s_idplus).PadLeft(4,'0');
}
string sqlUpdate = "update sequence_num set s_id = @s_id where tmstmp = @tmstmp";//保證在記錄未被修改的情況下更新,如果更新不成功,則重走一遍生成序列號的流程
comm.CommandText = sqlUpdate;
comm.Parameters.Clear();
comm.Parameters.Add("@s_id",SqlDbType.VarChar,50);
comm.Parameters["@s_id"].Value = s_id;
comm.Parameters.Add("@tmstmp",SqlDbType.Timestamp);
comm.Parameters["@tmstmp"].Value = tmstmp;
}
while(comm.ExecuteNonQuery()<=0);
}
catch(SqlException ex)
{
string aaa = ex.Message;
}
finally
{
if(conn!=null)
{
conn.Close();
}
}
return s_id;
}
這個流程都是在.net里實現的,實際使用中可以通過存儲過程來實現。當然,這種方法對資料庫的訪問會比較頻繁,另外,資料庫表建立的時候必須插入一條初始值,這是代碼不完善的地方,有時間的話我會去完善它。只是判斷如果表內沒有記錄的情況下就插入一條初始記錄,這個時候如何處理並發問題還沒想明白。
㈣ 怎麼做資料庫的業務編號
很好解決~告訴你個笨辦法~在SQL裡面使用SUBSTRING方法截取字元串,比如你現在是HQ-000002 是最後1條編號,那麼 MAX(SUBSTRING(編號,3,6))這樣出來的結果為2,然後在用程序怎加編號的時候,用這個2加上1~邊成3,判斷3的長度是幾位,如果是長度為1,前面加5個0;如果是長度是2,前面加4個0;以此類推,最後的結果加上"HQ-"這樣就可以實現自動編號。不知道能不能幫到你!
㈤ 關於sql存入流水號,取流水號號問題,,謝謝 在資料庫中要插入類似 ZH0000001 - ZH0000100
declare @i varchar(10) --變義變數@i
declare @q varchar(20)
set @i = 001--初始化@i為1
while @i < 101 --如果@i小於101,即插入100條記錄
begin ------------------
set @q='hz'+right(rtrim(1000000+@i),7)
print @q
insert into table (流水號) values(@q)
set @i = @i + 1
end --------------------
select * from table --- 查詢表
㈥ 電商平台資料庫中的訂單表為什麼要有訂單流水號這個欄位呢
第一 有些設計 訂單號中包含 商品信息,分類信息,店鋪信息。。。。。 , 意思是緊急是怎麼可以從訂單號中分析這些數據,還有就是 需要對一個交易做一個標記,而且是唯一,id並不是都適用,比如 涉及數據同步的時候,中途同步出錯就會導致數據id不一致,如果額外適用一個唯一標記,則這個問題就不會存在
㈦ oracle資料庫,流水號問題,大神進!
兩個建議:
第一:如果這個流水號並不表示數據順序,只是一個流水記錄的話,你可以在刪除完id=2的數據行之後,把流水號最大的一列變成該列,也就是id=2的這列,來填補空缺。
第二:如果這個流水號表示順序,並且不能打亂,建議你寫一個刪除後觸發器,這樣刪除的時候,通過參數傳入刪除ID,然後自動更新大於該ID的數據的主鍵。
㈧ 流水號什麼意思
流水號【liú shuǐ hào】一般指某活動參加人的號碼;銀行的編碼;也應用於工業生產中,每個產品有其唯一的流水號。
㈨ 資料庫中關鍵字identity如何使用
在資料庫中, 常用的一個流水編號通常會使用 identity 欄位來進行設置, 這種編號的好處是一定不會重覆, 而且一定是唯一的, 這對table中的唯一值特性很重要, 通常用來做客戶編號, 訂單編號等功能, 以下介紹關於此種欄位常用方式及相關技術.
CREATE TABLE procts (id int IDENTITY PRIMARY KEY, proct varchar(40))
取得identity值:
因為 identity 特性, 所以在 insert into 該 table 時, 不能指定該 identity 欄位值, 僅能指定其他欄位值, 而 identity 由資料庫維護, 所以一般要在 insert 後取得該 identity 欄位值, 則通常使用下面方式:
利用全局變數 @@identity 來取得最後影響的 insert 後產生的 identity 值, 如此一來便能方便地使用 identity 欄位.
若要啟用識別插入(identity insert)時, 也就是如空缺號要指定 identity 欄位值時, 或者是處理資料表整理或備出時, 會用到的方式:
set identity_insert procts on
insert into procts (id, proct)values(12, 'screwdriver')
要注意的地方是可以 insert 空缺號, 也可以加至最後, 但系統會自動更新 identity 至最大值, 要注意一旦啟用 identity_insert 時, 就一定要給定 identity 值, 另外並不能 update 該 identity 欄位值, 也就是說 identity_insert 該 identity 欄位僅 for insert, 不能 update.
查詢目前 identity 值:
有時我們需要查詢目前 table 中該 identity 欄位最大值是多少時, 可以利用 dbcc 指令, 如下:
dbcc checkident('proct', NORESEED)
可以獲得目前最大值的結果.
重設目前最大 identity 值:
一樣利用 dbcc 指令, 如下:
dbcc checkident('proct',RESEED,100)
如此一來, 便能將目前的最大 identity 值指向100, 當然若故意設比目前最大值小時, 系統仍會接受, 但若 identity 遇上重覆資料時(如將 identity 設為 primary key時), 將會發生重大問題, 該 table 變成無法 insert 資料, 因為會發生 primary key violation, 解決方法當然就是將目前的 identity 修復, 直接使用
dbcc checkident('procts', RESEED)
或
dbcc checkident('procts')