Sql-Server-2005
以較少的查詢成本將數據插入關係表和數據表中
我有一個類似的表格佈局:
create table data ( id int identity primary key , value int not null); create table relation (id int identity primary key , someid int not null , dataid int foreign key references data(id));
在向表中插入數據時,在大多數情況下,我需要
data
在relation
.目前我這樣做:
-- insert data.value = 1337 and relation.someid = 42 + relation.dataid = 1337 if not exists (select id from data where value = 1337) insert into data (value) values (1337); insert into relation (someid, dataid) values (42, (select id from data where value = 1337));
這是正確的解決方案嗎?
如果我需要插入許多這樣的行,我該怎麼辦?
目前我將所有數據插入
data
,然後對relation
.
使用該語句的
OUTPUT
子句INSERT
來擷取在 中創建的標識值data
。然後使用它來寫入relation
.create table #data ( id int primary key , value int not null); if not exists (select id from data where value = 1337) insert into data (value) OUTPUT INSERTED.id, INSERTED.value INTO #data values (1337); select * from #data; insert into relation (someid, dataid) select 42, id from #data; select * from relation;
我想到了類似的東西,看著你的問題。它使用EXCEPT運算符和公用表表達式。這將允許您填充數據表,然後最終將這些值非同步插入到關係表中。例如,每 N 小時執行一次並更新關係表的作業。
我更改了您的創建表語句,因為
- 我不確定我是否理解 someid 的用途
- id 欄位,因為它的使用身份足以用於關係表和數據表之間的外鍵引用
使用一些數據庫;
CREATE TABLE data ( id int IDENTITY(1,1) PRIMARY KEY, value INT NOT NULL); CREATE TABLE relation (id int IDENTITY(1,1) PRIMARY KEY, dataid int FOREIGN KEY REFERENCES data(id)); /* insert some rows into data table */ INSERT INTO DATA(value) values(1337) INSERT INTO DATA(value) values(1338) INSERT INTO DATA(value) values(1339) GO /* if there are new rows in data, insert them into relation */ ;WITH CTE AS ( SELECT id FROM data ) INSERT INTO relation (dataid) SELECT id FROM CTE EXCEPT SELECT dataid from relation