2013-08-03 141 views
0

之前完整性我有跟随和外形的两个表,然后按照下面的配置文件的表插入ID(外键)检查外键是插入

如何我可以插入我的表外前务必匹配表的配置文件ID的键?

var o_segui = { 
    seguace_id: profilo, 
    seguito_id: data.profilo_da_seguire, 
    created: new Date() 
}; 

connection.query('INSERT INTO follow SET ?', o_segui, function(error, rows) { 
if (error) { 
    var err = "Error on 'seguiAction': " + error; 
    console.error(err); 
    throw err; 
} 

现在我检查目前已与查询存在插入像以前一样:在我插入

connection.query('SELECT count(*) as n FROM profile WHERE id =' + connection.escape(profilo_da_seguire), function(error, rows) { 
if (error) { 
    var err = "Error on 'verifico Profilo': " + error; 
    console.error(err); 
    throw err; 
} 

console.log(rows); 

if (rows.shift().n > 0) { then OK 

更新我就扔嗯...如果我评论这么想的走下来扔ERR服务器节点...我必须评论这条线并关闭连接?

回答

0

设置先检查的通常不会同时使用数据库一个很好的方法。主要是因为你必须考虑到可能的并发访问你的表。

无论如何,关于外键约束,如果你使用InnoDB,引擎在插入时检查你。

所以,我觉得这是更好地被尝试插入乐观。但要准备妥善处理可能的失败。

编辑:我为了建立一个例子来“证明”完整性约束是由数据库引擎InnoDB的强制执行:http://sqlfiddle.com/#!2/f372d/1

正如你所看到的,错误的数据插入数据库。在你的程序中,你将不得不处理相应的异常/错误。

+0

是的,但如果我的外键不完整,我的服务器节点就会关闭 – Barno

+0

请重新阅读我的答案,并尝试在InnoDB表上尝试更多外键约束。你会看到,如果你正确定义了你的表,那么“不好的数据”永远不会被插入。简单地说,数据库的*完整性*由引擎*强制执行。但是*你*必须在程序层面处理可能的失败。 –

+0

这是工程,现在我怎么能在node.js中做到这一点:) ..我接收错误:ER_NO_REFERENCED_ROW_ – Barno