【问题标题】:Referencing attributes with insert triggers使用插入触发器引用属性
【发布时间】:2013-09-19 13:30:00
【问题描述】:

我与高中生有两个关系(ID、姓名、年级)和喜欢(ID1、ID2)

我想制作一个插入触发器,将记录插入到 likes 关系中。

当我在 Highschooler 关系中插入一个新的 Highschooler 时,我希望我的插入触发器将记录插入到喜欢中,并且基本上新的 highschooler 喜欢同一年级的每个人。

我想要的是如下所示:

create trigger R1
after insert on Highschooler
for each row
when (Old.grade = New.grade)
begin
    insert into Likes values(New.ID, Old.ID));   
end;

但是,对于插入触发器,旧引用无效!那么如何引用旧属性呢?

@Bill Gregg:感谢您的提示和解释。这就是你的建议吗?

create trigger R1
after insert on Highschooler
for each row
begin
    insert into Likes values(hs.ID, old.ID));
    select(hs.ID, old.ID from Highschooler hs, Highschooler old
    where hs.grade = old.grade and hs.ID <> old.ID
end;

我在我的 DBMS 上运行它,但它没有执行。我怀疑在插入后使用 select 语句存在一些问题。

【问题讨论】:

  • 顺便说一下我用的是sqlite。
  • 您不能混合插入方法。您不能“插入值”和“插入选择”。我认为我的代码将按照编写的方式工作(假设您将其放入“for each row”操作中,这实际上是有效的 SqlLite 语法。

标签: sql database sqlite triggers


【解决方案1】:

插入触发器上没有“旧”之类的东西,因为旧行不存在。您只是插入一个新行。

我想你想要的是

for each row

insert into Likes (FirstID,SecondID)
select hs.id, new.id
from HighShooler hs
where hs.grade = new.grade
and hs.id != new.id

【讨论】:

  • 你不需要两个高中生关系之间的连接吗?高中生,高中生老了?
  • 你的每一行都有新的高中生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
  • 2013-09-30
  • 2011-08-05
相关资源
最近更新 更多