已有帖子,例如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编程 - 只是在
有一个明显的必要解决方案。
答案 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');