共有三个表:Objs, Attrs и Binds- 一个有对象,另一个 - 所有可能的参数,第三个 - 对象和属于它们的参数的对应关系,即 链接到该数据。如何将表Objs和的部分数据复制一份Binds,并粘贴到同一个表中,从而保留数据之间的对应关系?同时,表中的字段是Id唯一的并且是自动生成的。数据结构:ObjsAttrs
CREATE TABLE Objs(
Id INT IDENTITY
,Name NVARCHAR(256) NULL
,CONSTRAINT PK_Objs_Id PRIMARY KEY CLUSTERED (Id)
) ON [PRIMARY];
CREATE TABLE Attrs(
Id INT IDENTITY
,Name NVARCHAR(256) NULL
,CONSTRAINT PK_Attrs_Id PRIMARY KEY CLUSTERED (Id)
) ON [PRIMARY];
CREATE TABLE Binds(Obj_Id INT, Attr_Id INT);
ALTER TABLE Binds
ADD CONSTRAINT FK_Binds_Objs_Id FOREIGN KEY (Obj_Id) REFERENCES Objs (Id);
ALTER TABLE Binds
ADD CONSTRAINT FK_Binds_Attrs_Id FOREIGN KEY (Attr_Id) REFERENCES Attrs (Id);
GO
例子:
+------------------------+ +-------------------+ +--------------------+
| Objs | | Attrs | | Binds |
+--------+---------------+ +--------+----------+ +--------+-----------+
| Id | Name | | Id | Name | | Obj_Id | Attr_Id |
+--------+---------------+ +--------+----------+ +--------+-----------+
| 1 | Круг | | 1 | Длина | | 1 | 5 |
| 2 | Прямоугольник | | 2 | Ширина | | 2 | 1 |
| 3 | Конус | | 3 | Высота | | 2 | 2 |
+--------+---------------+ | 4 | Глубина | | 3 | 5 |
| 5 | Радиус | | 3 | 3 |
| 6 | Скорость | +--------+-----------+
| 7 | Масса |
| 8 | Время |
+--------+----------+
您需要从 Objs 表中复制 Rectangle 和 Cone 并将其粘贴到其中,然后将对应关系粘贴到 Attrs 表中以结束
+------------------------+ +---------------------+
| Objs | | Binds |
+--------+---------------+ +---------+-----------+
| Id | Name | | Obj_Id | Attr_Id |
+--------+---------------+ +---------+-----------+
| 1 | Круг | | 1 | 5 |
| 2 | Прямоугольник | | 2 | 1 |
| 3 | Конус | | 2 | 2 |
| 4 | Прямоугольник | | 3 | 5 |
| 5 | Конус | | 3 | 3 |
+--------+---------------+ | 4 | 1 |
| 4 | 2 |
| 5 | 5 |
| 5 | 3 |
+---------+-----------+
要将数据Objs и Binds复制到 Binds 表并将匹配项保存在 Binds 表中,我可以循环复制数据 - 从 Objs 表中复制必要的数据,将它们插入其中,获取新的 Id,然后从 Attrs 表中获取数据使用所需的 Obj_Id,将此数据插入表中,用新的 Obj_Id 替换旧的 Obj_Id。问题是可能有很多复制的数据,你不能使用循环,因为 sql查询中的循环大大减慢了它的执行速度,查询处理的速度对我来说很重要。
基于这一切,有几个问题:
- 我认为这是复制相关数据的典型任务。告诉我你在哪里可以看到这种复制的算法,或者,如果你知道,告诉它?
- 我可以确定 INSERT INTO 命令会按照我将数据传递给它的顺序将数据准确地插入到表中吗?
通常会创建一个查找表:
然后将必要的数据复制到主表中,并在对应表中显示成对的标识符(现有/新、原始/副本):
然后复制剩余表中的数据:
如果一次只插入一行。通常,插入顺序被认为是未定义的。以任何特定顺序插入行几乎没有意义,因为 插入顺序不保证任何存储或后续检索顺序。如果采用称职的方法,则不应出现这种需要。