sql-server - 引用代理键

标签 sql-server database foreign-keys

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

请注意,我想做的是通过我的程序(在数据库管理系统之外)添加元组/记录。流程为:

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

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

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

编辑:

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

最佳答案

如果您的 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)可以让您引用第二个 INSERT 语句中生成的 table1 ID 值(而不是 currval 调用)

关于sql-server - 引用代理键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10866317/

相关文章:

sql-server - SQL Server array_agg(主 - 详细)

sql-server - 一对多返回单行

sql - 如何 - 在 SQL Server 中创建后直接创建和使用数据库?

database - 将 where 和 whereIn 查询合并为单个请求

sql - Firebird:更改 "anonymous"外键

sql - SQL 中的复杂外键约束

python - 是否可以从 SQL Server 在 Active Directory 中启动新条目或更新 Active Directory 中的现有条目?

sql-server - django.db.utils.InterfaceError : ('IM002' , '[IM002] [Microsoft][ODBC 驱动程序管理器] 未找到数据源名称且未指定默认驱动程序 (0))

sql - 特定数据的不良 desc 排序性能 - Postgresql 10.3

MYSQL 5.7 ERROR 1215 外键 + 全文键