2013-06-05 66 views
0

我是新來的SQL,並試圖用谷歌搜索這個答案,但沒有運氣。SQL自動增量條件

我有如下表(簡體):

Table1: Transaction 
Columns: idTransaction, fkWorker 

Table2: Worker 
Columns: idWorker (Primary Key, Unique), FirstName, Wage 

[fkWorker is linked to idWorker] 

我希望能組相同的事務下1名多工人,但保持每個工人對自己的行。

E.g.: 
[TRANSACTION TABLE] 
[IDTRANSACTION][FKWORKER] 

|1   ||Worker3 | 

|1   ||Worker4 | 

|2   ||Worker3 | 

|2   ||Worker4 | 

|2   ||Worker1 | 

|3   ||Worker1 | 

是否有可能做到這一點與自動增量,但是,直到特定項目的所有工人都被添加到表它不添加到事務ID?我已經探索了爲worker外鍵添加多個列的選項,例如。 fkWorker1,fkWorker2,fkWorker3等,但它變得繁瑣與大量的工人。

謝謝你在前進,

馬克西姆

+1

如果我沒有誤解你的問題。不,但可以將回滾邏輯合併到插入存儲過程或查詢中。 – Learner

回答

2

簡短的回答是否定的,這是不可能的利用上TransactionidTransactionAUTO_INCREMENT屬性達到你想要的結果。

更長的答案是,它是可能的,它可以完成,但SQL使這項工作將是尷尬的。

更直接的方法是將您當前的Transaction表「拆分」爲兩個表格:TransactionTransactionWorker

您當前的表格確實是TransactionWorker表格。該表中的一行表示WorkerTransaction之間的關係。 A Transaction可能與一個以上的Worker相關聯,並且Worker可能與多於一個的Transaction相關聯。

Transaction表中的一行恰好代表一個實體。您可以使用AUTO_INCREMENT ID爲此表中的行分配唯一的ID。

對於那個TransactionWorker表,我們經常選擇一個名稱,以某種方式表明它是一個關係表。此表中的一行與一個Transaction關聯或關聯,並且恰好與一個Worker關聯或關聯。


TABLE: Transaction 
     idTransaction INT NOT NULL AUTO_INCREMENT PRIMARY KEY 

TABLE: TransactionWorker 
     fkTransaction INT NOT NULL 
     fkWorker  INT NOT NULL 

TABLE: Worker 
     idWorker  INT NOT NULL PRIMARY KEY 

(在某些情況下,我們可以找到關係表不同的名稱,例如MemberMembershipPersonGroup之間的關係。

您可以將排到Transaction表並允許id列由AUTO_INCREMENT修飾符生成。

將一行插入Transaction表後,可以使用LAST_INSERT_ID()函數(在同一數據庫會話中)檢索上次生成的AUTO_INCREMENT值。

然後,您可以在隨後插入TransactionWorker表中使用該檢索值。

這是解決這類問題的規範模式。

+0

我認爲這將起作用。非常感謝,特別是對於詳細的解釋!乾杯,馬克西姆。 – Maxim

1

你需要三個表格,而不是兩個。您的交易表應該有

  1. Transactions表沿着鍵TransactionId應該有TransactionId有關交易的信息一起(比如時間和地點)。
  2. Workers表中包含您的Worker表中的信息。
  3. TransactionUsers表是一個「連接」表。它在每次交易中對每個用戶都有一行。因爲所有表都應該有一個主鍵,所以至少有三列:TransactionUserIdTransactionIdUserId

所有的主鍵都會自動遞增。

您將在TransactionUsers中分配交易以及用戶標識。