2

我有一个具有自动增量代理键的表。我想用它作为我另一个表的外键。问题是,我不知道如何将它引用到该表,因为几乎不可能确定我必须引用什么(代理键的实际值)。

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

  1. 在 Table1 中添加一条新记录并生成一个自增键。更新

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

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

编辑:

很抱歉没有指定数据库和冗长的回复。我使用微软的 sql 服务器。

4

2 回答 2

1

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

  1. 将表 1 中的表 2 的外键设置为可为空,以便在确定表 2 中记录的键后对其进行更新。
  2. 先保存表 2 中的记录,然后将引用新保存的表 2 记录的表 1 中的记录保存。这样,您不必将表 1 中的表 2 的外键声明为可为空,并且会是执行此操作的首选方式。
于 2012-06-02T22:23:08.317 回答
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),通常有一个函数(例如@@IDENTITYSQL Server)可以让您在第二个 INSERT 语句中引用 table1 生成的 ID 值(而不是的currval呼叫)

于 2012-06-02T22:30:21.433 回答