2015-10-15 55 views
0

我有一个主设备表,通过它的ID(FK)链接到其他表(特定的设备信息表)。检查是否所有插入在外键上都成功

因此,我的创建表单将特定设备类型信息(例如PC HDD大小,OS ...)插入适当的设备类型表(每个设备类型有一个),然后我将$ this-> db-> insert_id(),并将其与一般设备信息(如购买日期,授权截止日期等)一起插入主设备表中。

这个效果很好。但是,如果由于任何原因主表的数据无效 - 第二个查询将失败,并将插入的行留在适当的设备类型表中。

有没有一种方法来检查查询是否会成功之前实际执行我的模型中的完整功能?或者 - 如果第二个查询(或第三,第四...如果我有多个插入)失败,是否可以回滚更改?

+0

我认为你最好检查为什么第二次插入查询失败的原因,为什么以及如何将无效数据加入到你的程序中?你忘了逃避一些字符串?还有别的吗? –

+0

啊,这不是查询失败 - 我只是想知道一般 - 是否有办法确保插入代码本身。我的插入工作是因为我使用jQuery和后端的CI验证设置了前端验证,所以在插入和处理数据时这非常安全。 – Skipp

回答

1

只需在一次交易中完成所有操作。要么全部成功,要么全都不成功。

+0

从CI文档: $ this-> db-> trans_start(); $ this-> db-> query('AN SQL QUERY ...'); $ this-> db-> query('ANOTHER QUERY ...'); $ this-> db-> query('AND NOT OTHERETERY ...'); $ this-> db-> trans_complete(); 使用常规活动记录CI方法执行此项工作吗?我不想在我的代码中使用纯SQL查询 – Skipp

+0

这些是更新,而不是查询。事务的ACID属性保证了我描述的行为。它是数据库的一个属性:它与CI或PHP无关。我不知道你最后一句话的意思,但你必须使用任何符合你要求的技术。 – EJP

+0

好吧,通常我只是使用CI活动记录来编写查询 - 我不会在我的代码中编写SQL。从CI文档看来,您需要将MYSLQ查询字符串传递到$ this-> db-> query(),这是我不喜欢的。 所以我想知道是否可以将我当前的CI活动记录代码包装在$ this-> db-> trans_start()和$ this-> db-> trans_complete()中? – Skipp