我是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等等,但是对于大量的工作人员来说,它变得乏味。
提前谢谢你,
马克西姆
答案 0 :(得分:2)
简短的回答是否定的,不可能使用AUTO_INCREMENT
表的idTransaction
上的Transaction
属性来实现您想要的结果。
更长的答案是,它是可能的,它可以完成,但是使这项工作的SQL会很尴尬。
更直接的方法是将当前Transaction
表“拆分”为两个表:Transaction
和TransactionWorker
。
您当前的表格实际上是TransactionWorker
表格。此表中的一行表示Worker
和Transaction
之间的关系。 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
(在某些情况下,我们可以为关系表找到不同的名称,例如Member
或Membership
与Person
和Group
之间的关系。
您可以在Transaction
表格中插入一行,并允许id
修饰符生成AUTO_INCREMENT
列。
在Transaction
表中插入一行后,您可以使用AUTO_INCREMENT
函数(在同一数据库会话中)检索上次生成的LAST_INSERT_ID()
值。
然后,您可以在TransactionWorker
表的后续插入中使用该检索到的值。
这是解决此类问题的规范模式。
答案 1 :(得分:1)
你需要三张桌子而不是两张桌子。您的交易表应包含密钥TransactionId
以及
Transactions
表格应包含TransactionId
以及有关交易的信息(比如何时何地)。Workers
表格中包含Worker
表格中的信息。TransactionUsers
表是一个“连接”表。每个事务中每个用户都有一行。由于所有表都应包含主键,因此至少应包含三列:TransactionUserId
,TransactionId
和UserId
。所有主键都会自动递增。
您可以在TransactionUsers
中分配交易以及用户ID。