【发布时间】:2012-10-22 19:03:49
【问题描述】:
我们应该创建关系数据库,而不是平面结构。您创建与其他表有关系的表。您进行规范化以删除重复,并进行反规范化以提高性能。这一切都说得通。但是,我很难找到一个好的机制来插入关系结构。是否没有将记录插入关系结构的良好机制。有没有类似的东西:
INSERT INTO x LEFT JOIN y ON x.id = y.id VALUES(...)?
我能想到的最好的方法是一个存储过程:
INSERT INTO x
SELECT id FROM x (or @@id)
INSERT INTO y
这似乎与整个关系模型背道而驰......
它相当于没有连接的插入。我们是否会忍受不得不自己进行多项选择并将结果连接在一起?
【问题讨论】:
-
如果要插入多个表,请使用多个 SQL 语句(即批处理语句)、存储过程或触发器。我不知道你说的没有好的机制是什么意思。
-
好吧,如果您使用 Java,例如 Eclipselink 之类的 JPA 实现会为您执行此操作。
-
要扩展@RedFilter 的评论,您可以包装多个操作,例如INSERTs,在单个事务中确保逻辑操作是原子的。你的第二个例子是一个完美的例子。请注意,失败的操作可能仍会留下痕迹,例如,如果您的第二个 INSERT 失败并且事务回滚了第一个 INSERT,则仍然会消耗一个标识值。
-
@RedFilter 在我看来这有点像说你不需要加入,你可以做多个选择并将它们连接在一起。对我来说,sql 会给你连接,但插入操作却不一样,这对我来说似乎很奇怪。
-
ANSI 标准 (2008) 显然允许在“有意义”时插入视图(即,可能不适用于包含聚合的内容),但它是可选的,并非所有供应商都实现了它(我知道 DB2 没有——但您可以定义“替代”触发器)。你还有什么推荐的?
标签: sql sql-server database insert relational-database