Sql-Server-2005

以較少的查詢成本將數據插入關係表和數據表中

  • March 30, 2015

我有一個類似的表格佈局:

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));

在向表中插入數據時,在大多數情況下,我需要datarelation.

目前我這樣做:

-- 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 小時執行一次並更新關係表的作業。

我更改了您的創建表語句,因為

  1. 我不確定我是否理解 someid 的用途
  2. 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

引用自:https://dba.stackexchange.com/questions/76398