2011-11-07 97 views
0

我正在創建一個票務系統,用於跟蹤客戶創建的票證。票的基本信息將被存儲在表「門票」誰的結構如下:具有日期前綴(Php/MySQL)的唯一標識符混合格式

Primary Key (int 255) 
    Ticket_Key (varchar) 
    Ticket Number (varchar 500) 
    Label 
    Date Created 
    Delete 

and so on.. 

的問題是,最終將會大量門票的,我們需要確定門票更統一的方式。我希望PHP在票號中創建一個包含混合值的票號。日期(格式爲20111107),後跟一個自動遞增的值1001. 1002,1003,...)。因此,例如,票號將爲201111071001。

問題是我該如何在PHP中編程插入到MySQL數據庫?另外,如何防止在PHP中使用唯一標識重複值的可能性?將有非常大量的客戶使用該表插入記錄。

+0

當ID值。 YOu可以先進行INSERT,然後獲取新ID並使用它來更新您的門票號碼 – musefan

+0

@musefan:我首先想到了這一點。但這是另一回事。機票號碼基本上是機票的日期,然後是機票的創建位置或訂單。例如201111070001,2011111070002,2011111070003,201111107000X。然後當第二天到來時,它將像這樣重置:201111080001,依此類推。那我會怎麼做? –

+0

我將創建一個答案,以便我可以解釋更多細節。 – musefan

回答

0

,因爲我明白,你想兩個不同的領域,如datefieldticketnumfield

在MySQL

的一個結果,你通過命令做到這一點:

SELECT concat(datefield, ticketnumfeild) FROM `tbl_name` 

該查詢返回像201111071001

結果
+0

這實際上是一個很好的解決方案,像@musefan,但是,如何在下一個日期重置ticketnumfield?如果我繼續讓ticketnumfield在沒有重置的情況下繼續增加,那麼ticketnumfield最終會是一個非常大的數字。 –

0

我之前做過類似的事情,我想在每個新的一天刷新計數器。不幸的是,我不會說PHP,所以你將不得不解決的解釋,也許一些僞代碼。

首先,在配置文件中創建幾個字段以跟蹤您的計數器。這應該是一個日期字段和一些領域......

LastCount (Number) 
LastCountDate (Date) 

然後,你要確保在你的數據庫表的票號字段設置爲唯一的值,所以它拋出一個錯誤,如果你嘗試插入一個副本。

然後在你的代碼,你加載計數器值(LastCount和LastCountDate),你處理它們是這樣的...

newCount = LastCount; 

if LastCountDate == Today 
    increment newCount (newCount++) 
else 
    reset newCount (newCount = 1) 

您就可以使用newCount創建您的票號。

接下來,當您嘗試插入一行時,如果成功,那麼很好。如果失敗,則需要再次增加newCount,然後再次嘗試插入。重複此操作,直到插入成功(將其放入循環中)

成功插入行後,您需要使用剛剛用於生成故障單號的計數值更新數據庫 - 以便它們準備就緒下次使用。

希望能以某種方式提供幫助。

+0

:那麼LastCount和LastCountDate應該是數據庫中的字段? –

+0

@凱文:是的,我會把它們放在一個「配置」表中。只需要一行,您可以繼續使用新值更新。 – musefan

+0

如果您有大量的人嘗試插入表中,則可能會面臨此解決方案的併發問題。 – liquorvicar

1

如何使用自動增量並將其與日期字段組合以生成該日期的序列號並因此生成ticketId。

所以你插入的過程會是這樣的:

INSERT INTO table (...ticket info...) 

你會再檢索自動增量此行像這樣運行

UPDATE table SET sequence = (SELECT ($id-MAX(auto_increment)) FROM table WHERE date_created=DATE_SUB(CURDATE(),INTERVAL 1 DAY)) WHERE auto_increment=$id 

然後,您可以很容易地創建一個查詢格式爲YYYMMDDXXXX的ticketId。假設你以前從不復古添加票據,即使在大量使用情況下,也只需要這兩個查詢。

[編輯]事實上,在研究這個之後,有一種更好的方式可以在MySQL中本地執行此操作。如果你定義了兩列(日期和序列),並將它們作爲序列字段的主鍵(兩列)作爲自動增量,那麼MySQL將更新序列列作爲每個日期的自動增量(即它將以值開始每個日期1個)。

[編輯]沿着這些線路的表結構會爲你做的工作:如果你的數據庫支持自動增量

CREATE TABLE IF NOT EXISTS `table` (
    `created_date` date NOT NULL, 
    `ticket_sequence` int(11) NOT NULL auto_increment, 
    `label` varchar(100) NOT NULL, 
    [other fields as required] 
    PRIMARY KEY (`created_date`,`ticket_sequence`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 

檢索數據,那麼你可以做這樣的事情

SELECT CONCAT(DATE_FORMAT(created_date,'%Y%m%d'),LPAD(ticket_sequence,4,'0')) AS ticket_number, other fields.... FROM table 
+0

:請你向我解釋一下你將如何做到這一點是MySQL?我似乎無法找到。 –

+0

@KevinOluseunKarimu我編輯了我的帖子來舉一個例子。 – liquorvicar

+0

問題是我需要票據序列來重置每個日期。對於明天的例子,票證序列應該重置爲0001 –