引用代理键

时间:2012-06-02 22:10:00

标签: sql-server database foreign-keys

我有一张具有自动增量代理键的表。我想用它作为我的另一个表的外键。问题是,我无法弄清楚如何将它引用到该表中,因为几乎不可能确定我必须引用的内容(代理键的实际值)。

请注意,我要做的是通过我的程序(在dbms之外)添加元组/记录。这个过程是:

  1. 在Table1中添加新记录并生成自动增量密钥。更新

  2. 在Table2中添加一条新记录,并将其外键引用到Table1的主键。更新

  3. 我的问题是:如果我不知道它是什么,我如何存储外键?

    修改

    很抱歉没有指定数据库和长回复。我使用的是microsoft sql server。

2 个答案:

答案 0 :(得分:1)

由于您没有提到数据库软件的名称,并且由于您的问题似乎不是如何声明代理键,您可以:

  1. 将表1中的表2的外键设置为可为空,因此您可以在确定表2中的记录密钥后对其进行更新。
  2. 首先保存表2中的记录,然后保存表1中的记录,该表引用表2中新保存的记录。这样,您不必将表1中的表2的外键声明为可为空,并且将是这样做的首选方式。

答案 1 :(得分:1)

如果您的DBMS支持序列(大多数现代DBMS都这样做),只需为table1生成PK值,然后使用DBMS的“currval”功能引用该FK值。

类似(PostgreSQL语法,但其他DBMS支持序列具有非常相似的功能):

INSERT INTO table1 (id, col1, col2) 
VALUES (nextval('id_sequence'), 'foo', 'bar');

INSERT INTO table2 (t1_id, col1)
VALUES (currval('id_sequence'), 'foobar');

另一种选择是简单地在程序中获取ID值,然后在两个插入中使用该值。

如果您必须处理不支持序列的DBMS(例如2012年之前的MySQL或SQL Server),通常会有一个函数(例如SQL Server的@@IDENTITY),它允许您引用生成的ID值第二个INSERT语句中的table1(而不是currval调用)