2014-02-15 54 views
0

有一張表格可供多個用戶共享。基本的表結構將爲:如何跟蹤輔助索引編號

unique_id | user_id | users_index_id | data_1 | data_2 etc etc 

使用id字段爲int類型,unique_id爲具有自動增量的主鍵。

的數據將是這樣的:

unique_id | user_id | users_index_id 
1 | 234 | 1 
2 | 234 | 2 
3 | 234 | 3 
4 | 234 | 4 
5 | 732 | 1 
6 | 732 | 2 
7 | 234 | 5 
8 | 732 | 3 

如何跟蹤「users_index_id」,使其「自動增量」專門爲USER_ID?

任何幫助將不勝感激。正如我已經搜索了一個答案,但不知道我使用正確的術語來找到我需要的。

回答

3

一致的唯一方法是使用「插入前」和「更新前」觸發器。 MySQL不直接支持這種語法。你可以包裝所有更改表在存儲過程中,把邏輯那裏,或者使用非常謹慎的邏輯做一個insert時:爲了

insert into table(user_id, users_index_id) 
    select user_id, count(*) + 1 
    from table 
    where user_id = param_user_id; 

然而,這不會讓事情如果你做delete或一些更新。

當您查詢而不是在數據庫中時,您可能會發現計算users_index_id更方便。您可以使用子查詢(可能與表格上的正確索引正常)或使用變量(可能更快但無法放入視圖)來執行此操作。

如果您有table(user_id, unique_id)索引,那麼下面的查詢應該工作得很好:

select t.*, 
     (select count(*) from table t2 where t2.user_id = t.user_id and t2.unique_id <= t.unique_id 
     ) as users_index_id 
from table t; 

您將需要非abyssmal性能指標。

0

您需要找到MAX(users_index_id)並將其加1。爲避免必須手動鎖定表格以確保唯一密鑰,您需要在INSERT聲明中執行SELECT

INSERT INTO users (user_id, users_index_id) VALUES (234, (SELECT IFNULL(id, 0) + 1 FROM (SELECT MAX(users_index_id) id FROM users WHERE user_id = 234) dt)) 

查詢無子查詢(感謝戈登·利諾夫): 然而,除非它包裹在一個子查詢執行 INSERTUPDATE語句時MySQL不允許您引用的目標表

INSERT INTO users (user_id, users_index_id) SELECT 234, IFNULL((SELECT MAX(users_index_id) id FROM users WHERE user_id = 234), 0) + 1; 

http://sqlfiddle.com/#!2/eaea9a/1/0

+1

「MySQL不會讓你和借鑑e執行「INSERT」或「UPDATE」語句時的目標表,除非它包含在子查詢中「。這個陳述簡直是錯誤的。 MySQL完全支持'insert。 。 。選擇'語法,這是ANSI標準,並支持所有數據庫(我知道)。 'select'部分可以用插入引用表。 MySQL還支持使用'join'語法在更新中使用同一個表。 –

+0

@GordonLinoff我可能說錯了我的意圖,也許你可以幫我清理它?請根據提供的sqlfiddle模式測試以下語句:INSERT INTO users(user_id,users_index_id)VALUES(234,IFNULL((SELECT MAX(users_index_id)id FROM users WHERE user_id = 234),0)+ 1);' - you應該會收到錯誤SQL錯誤(1093):您無法在FROM子句中指定目標表'用戶'進行更新。 –

+0

。 。我絕不會親自在'values'語句中使用嵌套的'select',因爲'insert。 。 。選擇「工作得很好。你對可以做什麼和不可以做什麼做了一個全面的陳述。總括陳述並非如此。正如你所指出的那樣,存在產生錯誤的語法結構。 –