在SQL Server中,怎样INSERT多基表的视图(含两个表,有标识列,子表外键为ON NULL)
发布网友
发布时间:2022-04-10 01:58
我来回答
共3个回答
热心网友
时间:2022-04-10 03:28
第四次回答:
SET NOCOUNT ON 表示语句或存储过程不返回任何值,如果存储过程(触发器)中包含一些并不返回许多实际数据的语句,网络通信流量便会大量减少,将 SET NOCOUNT 设置为 ON 可显著提高性能。
在你这里,没必要加这个。
我给出的SQL代码是insert的,update的请楼主参考insert的触发器自行解决,相信那样才真的学进去了哦~(其实也很简单,理解了主外键和自增列的原理就不难)
如果仍有疑惑,请点击“在线交谈”或“离线留言”,给我发消息。我有时间的话可以和你一起探讨下这个问题。
————————————————————————————————
第三次回答:
那你能否把你的问题描述下呢?另外,你是在2010-01-02 10:20之后参照我的回答做的呢?
————————————————————————————————
第二次回答:
下面的回答于2010-01-02 10:20 修改,之前的触发器写错了两个地方。
————————————————————————————————
第一次回答:
楼上的回答没有考虑到update的情况。
另外,你的问题中提到ON NULL,是不是指:ON DELETE/UPDATE SET NULL?
如果是那样的话,子表中的商品ID(int,not null)外键、不可为空就不对,应该是可以为空才行。所以不明白你说on null的含义。请讲清晰。
以下触发器用以简单地处理标识列:
CREATE TRIGGER Trig_商品与规格Insert ON View_商品与规格
INSTEAD OF INSERT
AS
BEGIN
declare @商品ID int
IF (NOT EXISTS (SELECT 1 FROM A1商品表 A,inserted i WHERE A.商品ID = i.商品ID))
begin
INSERT A1商品表(商品分类ID,商标,外部调整,内部调整,品名代号,曾用品名代号)
SELECT 商品分类ID,商标,外部调整,内部调整,品名代号,曾用品名代号
FROM inserted
select @商品ID = @@IDENTITY
end
else
begin
select @商品ID = 商品ID from inserted
update A1商品表
set 商品分类ID = i.商品分类ID/*其它省略,请自己加*/
from A1商品表 a, inserted i
where a.商品ID = i.商品ID
end
IF (NOT EXISTS (SELECT 1 FROM A3商品规格表_轴承 B, inserted i
WHERE B.商品规格表_轴承ID = i.商品规格表_轴承ID))
INSERT A3商品规格表(商品ID,内径mm,外径mm,厚度mm,重量kg)
SELECT @商品ID,内径mm,外径mm,厚度mm,重量kg
FROM inserted
ELSE
UPDATE A3商品规格表_轴承
SET 商品ID = @商品ID,
内径mm = i.内径mm,
外径mm = i.外径mm,
厚度mm = i.厚度mm,
重量kg = i.重量kg
FROM A3商品规格表_轴承 B, inserted i
WHERE B.商品规格表_轴承ID = i.商品规格表_轴承ID
END
以上基本可以使用,但是仍然存在一个问题,就是如果当你插入到视图中的IDENTITY值不在表中的时候,即需要insert到基表的时候,绝大部分情况下基表自动增长的IDENTITY主键值不会等同于插入到视图中的IDENTITY值,这个时候如果你再插入同样的数据到视图,那么相应的数据又会insert到基表,这可能不是你所希望的。
如果要排除这种情况,首先需要保证你插入到视图中的IDENTITY值是有规律或者是唯一的,即起到主键值的作用。这时,你需要另外建一个表专门存放插入到视图中的IDENTITY值,以及实际在基表中的主键值。插入视图的时候如果发现在这个表中已经存在IDENTITY值,则将IDENTITY值改成相应的基表的主键值进行update.
当然,你还得区分,当这个IDENTITY值在基表中存在以及在这个专门存放插入到视图IDENTITY值的表也存在的时候如何处理,这需要看你的实际需求来决定。
热心网友
时间:2022-04-10 04:46
--------------创建基表
create table A1 (
/*商品ID*/ GID int not null PRIMARY KEY IDENTITY(1,1),
/*商品分类ID */GKID smallint,
/*商标 */SB nvarchar(20),
/*外部调整*/ WBTZ nvarchar(20),
/*内部调整*/ NBTZ nvarchar(20),
/*品名代号 */PMDH nvarchar(20),
/*曾用品名代号 */OPMDH nvarchar(20)
)
CREATE TABLE A3
/*商品规格表_轴承ID*/(GGID int not null PRIMARY KEY IDENTITY(1,1),
/*商品ID(*/GID int not null,
/*内径mm(*/NJ decimal(8,2),
/*外径mm(*/WJ decimal(8,2),
/*厚度mm(*/HD decimal(8,2),
/*重量kg(*/ZL decimal(6,3),
CONSTRAINT FOR_A1_GID FOREIGN KEY (GID) REFERENCES A1(GID)
)
---------------------创建视图
create view V_A1_A3 AS
SELECT A1.*,A3.NJ,A3.WJ,A3.HD,A3.ZL FROM A1 LEFT JOIN A3 ON A1.GID=A3.GID
SELECT * FROM V_A1_A3
-----------创建触发器
CREATE TRIGGER T_VA1_3_INSERT ON V_A1_A3
INSTEAD OF INSERT
AS
DECLARE @GID INT
BEGIN
SET NOCOUNT ON
-- IF NOT EXISTS (SELECT * FROM A1 JOIN INSERTED I WHERE A1.GID=I.GID)
BEGIN
INSERT INTO A1 (GKID,SB,WBTZ,NBTZ,PMDH,OPMDH)
SELECT GKID,SB,WBTZ,NBTZ,PMDH,OPMDH FROM INSERTED
SELECT @GID=@@IDENTITY ---得到最新插入的自增长值
INSERT INTO A3 (GID,NJ,WJ,HD,ZL)
SELECT @GID,NJ,WJ,HD,ZL FROM INSERTED
END
END
INSERT INTO V_A1_A3 VALUES(11,11,11,1,11,22,33,44,12,76,33)
SELECT * FROM V_A1_A3
SELECT * FROM A1
SELECT * FROM A3
你可以试试,我测试了 代码没有问题。你再研究研究,有问题hi我
热心网友
时间:2022-04-10 06:20
象你的示例那样,加一句SET NOCOUNT ON
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
你可以将gulingeagle的答案中,语句的第二句写成
INSTEAD OF INSERT,UPDATE
然后试一下。