SQLite In Clause不在触发器中工作

时间:2016-01-28 11:51:53

标签: c# sqlite ado.net dapper

  

我有两个表Table1和Table2。 Table1具有列ID,字符串ID和表2列ID,数据

     

There are two tables in picture

     

我创建了一个基于table1删除行的触发器。       如果逗号分隔的字符串ID,它不起作用       不止一个。如果stringIDs只是单个值

,它就可以工作
<div class="row">
    <div class="col-lg-2 col-sm-4 col-xs-6"></div>
    <div class="col-lg-2 col-sm-4 col-xs-6"></div>
    <div class="col-lg-2 col-sm-4 col-xs-6"></div>
    <div class="col-lg-2 col-sm-4 col-xs-6"></div>
    <div class="col-lg-2 col-sm-4 col-xs-6"></div>
    <div class="col-lg-2 col-sm-4 col-xs-6"></div>
</div>
<div class="row">
    <div class="col-lg-2 col-sm-4 col-xs-6"></div>
    <div class="col-lg-2 col-sm-4 col-xs-6"></div>
    <div class="col-lg-2 col-sm-4 col-xs-6"></div>
    <div class="col-lg-2 col-sm-4 col-xs-6"></div>
    <div class="col-lg-2 col-sm-4 col-xs-6"></div>
    <div class="col-lg-2 col-sm-4 col-xs-6"></div>
</div>

2 个答案:

答案 0 :(得分:2)

戈登是对的,这个表结构真的可能不是你想要的。但是如果由于某种原因你必须这样做,这个查询可能会达到你想要的效果:

delete from Table2 
where ID = old.stringIDs                   -- ID matches exactly
  or old.stringIDs like ID + ',%'          -- Or ID is at beginning of list
  or old.stringIDs like '%,' + ID          -- Or ID is at end of list
  or old.stringIDs like '%,' + ID + ',%'   -- Or ID is in middle of list

但这太乱了。不要这样做。而是从Table1中删除stringIDs列,并向Table2添加一个名为Table1ID的列,以指示此Table2记录属于哪个Table1 ID。所以Table2看起来像这样

ID     Table1ID     Data
1      1            some data
2      1            some data
3      2            some data
4      2            some data
5      2            some data
...

然后你的触发器查询可以简单地是:

delete from Table2
where Table1ID = old.ID

更干净的是完全跳过触发器并使用级联删除执行外键Contstraint。但我觉得这是另一天的教训。

答案 1 :(得分:0)

来自table1的

'stringIDs'将它们保存在具有外键引用的另一个表中,而不是在新表上应用触发器以从表2中删除记录