0

我是 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 等,但是对于大量工作人员来说变得乏味。

先感谢您,

格言

4

2 回答 2

2

简短的回答是否定的,不可能利用表格上的属性AUTO_INCREMENT来达到你想要的结果。idTransactionTransaction

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

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

您当前的桌子确实是TransactionWorker桌子。Worker此表中的一行表示 a和 a之间的关系Transaction。ATransaction可能与多个相关联Worker,而 anWorker可能与多个相关联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或在andMembership之间的关系上。PersonGroup

您可以在表中插入一行Transaction并允许该id列由AUTO_INCREMENT修饰符生成。

将行插入表后,您可以使用该函数Transaction检索最后生成的值(在同一数据库会话中)。AUTO_INCREMENTLAST_INSERT_ID()

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

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

于 2013-06-05T22:50:54.690 回答
1

你需要三张桌子而不是两张。您的事务表应该有密钥TransactionId以及

  1. Transactions表应具有TransactionId有关事务的信息(例如何时何地)。
  2. Workers表包含您Worker表中的信息。
  3. TransactionUsers表是一个“连接”表。每个事务中的每个用户都有一行。因为所有表都应该有一个主键,所以它至少有三列: TransactionUserIdTransactionIdUserId

所有主键都将自动递增。

您可以将交易与用户 ID 一起分配到TransactionUsers.

于 2013-06-05T22:53:24.340 回答