我使用MySQL的5.7與節點JS 6.11.0,我試圖每當我插入一個衝突行更新UNIQUE
MySQL的列。但是,當我嘗試插入衝突記錄時,只有現有記錄更新爲NULL
,並且沒有發生insert
。這裏是我的代碼節點MySQL在重複鍵更新更新唯一行
pool.getConnection(function(err, connection) {
var newClass = req.body;
var query = `INSERT INTO classes SET ? ON DUPLICATE KEY UPDATE teacher_id = NULL`;
connection.query(query, newClass, function(err, result) {
console.log(result);
if(result.affectedRows >= 1) {
res.status(201).end();
res.json(result);
}
});
connection.release();
});`
我有兩次被插入的行運行查詢;第一次將衝突列設置爲空,那麼當我再次運行相同的查詢時,由於沒有衝突,因此插入了行。
我已經採取了生成的SQL並直接從MySql控制檯運行它,我仍然必須運行查詢兩次插入新行。我不明白爲什麼它會這樣做。
SQL語句
INSERT INTO classes SET `stream` = 'Red', `form` = '1', `teacher_id` = '7' ON DUPLICATE KEY UPDATE teacher_id = NULL
我創建表的SQL是
| classes | CREATE TABLE `classes` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`form` varchar(10) NOT NULL,
`stream` varchar(15) NOT NULL,
`teacher_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `teacher_id` (`teacher_id`),
CONSTRAINT `classes_ibfk_1` FOREIGN KEY (`teacher_id`) REFERENCES `teachers`
(`id`)
) ENGINE=InnoDB AUTO_INCREMENT=33 DEFAULT CHARSET=latin1 |`
爲什麼MySQL的行爲這種方式?
我想達到的目標是先更新違規行,然後再插入新行。是否有可能做到這一點? –
@DennisWanyonyi用新的意圖更新。 – fyrye
所以@fyrye意味着我必須在MySQL中爲您建議的查詢啓用'multiple statements'。 –