带条件的SQL自动增量

时间:2013-06-05 22:01:46

标签: mysql sql mysql-workbench database

我是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 |

是否可以使用Auto Incremental执行此操作,但是在将特定项目的所有工作人员添加到表中之前,它不会添加到事务ID中?我已经探索了为工作者外键添加多个列的选项,例如。 fkWorker1,fkWorker2,fkWorker3等等,但是对于大量的工作人员来说,它变得乏味。

提前谢谢你,

马克西姆

2 个答案:

答案 0 :(得分:2)

简短的回答是否定的,不可能使用AUTO_INCREMENT表的idTransaction上的Transaction属性来实现您想要的结果。

更长的答案是,它是可能的,它可以完成,但是使这项工作的SQL会很尴尬。

更直接的方法是将当前Transaction表“拆分”为两个表:TransactionTransactionWorker

您当前的表格实际上是TransactionWorker表格。此表中的一行表示WorkerTransaction之间的关系。 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表中插入一行后,您可以使用AUTO_INCREMENT函数(在同一数据库会话中)检索上次生成的LAST_INSERT_ID()值。

然后,您可以在TransactionWorker表的后续插入中使用该检索到的值。

这是解决此类问题的规范模式。

答案 1 :(得分:1)

你需要三张桌子而不是两张桌子。您的交易表应包含密钥TransactionId以及

  1. Transactions表格应包含TransactionId以及有关交易的信息(比如何时何地)。
  2. Workers表格中包含Worker表格中的信息。
  3. TransactionUsers表是一个“连接”表。每个事务中每个用户都有一行。由于所有表都应包含主键,因此至少应包含三列:TransactionUserIdTransactionIdUserId
  4. 所有主键都会自动递增。

    您可以在TransactionUsers中分配交易以及用户ID。