sql:插入对象遍布多个表

时间:2013-09-06 12:39:53

标签: sql

已有帖子,例如this one,它声明SQL中的“天真”继承,即每个类级别使用一个表,这是很常见的事情。实施例

create table parent
( id integer primary key
, more-parent-attributes
);

create table child
( id integer primary key references parent(id) on delete cascade
, more-child-attributes
);

我的问题只是如何以惯用的ANSI SQL方式插入 child 进入表格。外键约束使我们成为第一个要求 使用id在parent中插入新行,然后在child中添加新行 parent行。我不知道怎么做(获得此ID)安全可移植,以及 只使用一个请求。 提示:我相当初学者,不知道命令式SQL编程 - 只是在 有一个明显的必要解决方案。

3 个答案:

答案 0 :(得分:0)

您必须执行两次插入。

第一个插入在父表中添加行,第二个插入在子表中添加行。

可以在同一事务中对两个插入操作进行分组。

要在父表中获取正确的插入ID,您必须从父级获取选择ID。

显示如下:

第1步:

INSERT INTO parent (id, more att) values (your ID, other values)

注意ID值,可以使用newid()(Sql server)uuid()(mySql)或autoincremental整数字段

第2步:

您可以使用功能键检索查询父表的密钥。

SELECT id FROM parent where functional_key satisfacted

例如,如果我在父表中存储雇员列表,则功能键可以是注册号。

所以你的查询变为:

SELECT id FROM parent WHERE register_no = 'YOUR_REGISTER_NUMBER'

第3步:

INSERT INTO child (id, fk_parent, other fields) values(id, fk_parent, other fields)

必须使用步骤2的结果对fk_parent字段进行评估。

在此步骤中,您可以:

使用变量赋值fk_parent,或者可以在insert语句中使用子查询(步骤2)。

答案 1 :(得分:0)

您正在寻找Scope_Identity():

DECLARE @Id INT

INSERT INTO parent (more-parent-attributes) values (.....)
SET @Id = Scope_Identity()

INSERT INTO child (parent(id), more-child-attributes) SELECT @Id, ....more-child-attributes

Scope_Identity()返回同一范围内的标识列。这意味着父键应该是标识列:

id  int IDENTITY(1,1)PRIMARY KEY

我认为就是这样,就好像你决定什么是父键ID一样,你会对子插入使用相同的。

答案 2 :(得分:0)

我最终做了类似的事情。您需要拥有一些可识别的数据,您可以将其插入Parent以获取Id。如果您在某种应用程序中使用它,那么您可以使用GUID。在我的应用程序中,我使用了一系列源列,我知道它会产生一个独特的值。

CREATE TABLE Parent
(
     Id INT IDENTITY NOT NULL PRIMARY KEY
    ,SourceId VARCHAR(50) NOT NULL
);

CREATE TABLE Child
(
     ParentId INT NOT NULL REFERENCES Parent (Id)
    ,Data VARCHAR(20)
);

-- Some procedure inserts the unique value
INSERT INTO Parent (SourceId) VALUES ('UNIQUE VALUE');

-- Another procedure inserts data using the unique value
DECLARE @Id INT;

SELECT @Id = Id FROM Parent WHERE SourceId = 'UNIQUE VALUE';

INSERT INTO Child (ParentId, Data) VALUES (@Id, 'Some Data');