我正在使用MySQL 5.7和Node JS 6.11.0,并且每当我插入冲突行时我都会尝试更新UNIQUE MysqL列.但是,当我尝试插入冲突记录时,只有现有记录更新为NULL并且不会发生插入.这是我的代码
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(); });`
@H_404_8@我必须为要插入的行运行两次查询;第一次将冲突列设置为null,然后当我再次运行相同的查询时,将插入该行,因为没有冲突.
我已经生成了sql并从MysqL控制台直接运行它,我仍然需要为要插入的新行运行两次查询.我不明白为什么这样做.
sql statement is
INSERT INTO classes SET `stream` = 'Red',`form` = '1',`teacher_id` = '7' ON DUPLICATE KEY UPDATE teacher_id = NULL
@H_404_8@我的创建表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 |`
@H_404_8@为什么MysqL表现如此?
INSERT INTO classes SET stream = 'Red',form = '1',teacher_id = '7' ON DUPLICATE KEY UPDATE teacher_id = NULL;
@H_404_8@在存在冲突记录(重复的唯一键或主键)时告诉MysqL,将违规行的teacher_id列设置为null并停止.
首先,您可以使用REPLACE语法.
REPLACE INTO classes SET stream = 'Red',teacher_id = '7';
@H_404_8@这将首先删除具有UNIQUE或主键约束的违规行,并插入具有指定值的新行.缺点是任何省略的列值都将丢失并设置为其默认值.如果未在查询中指定,还将创建新的自动生成(如果有)id.
如果没有违规记录,则会发生正常的INSERT.否则,您可以在UPDATE子句中使用VALUES.
INSERT INTO classes SET stream = 'Red',teacher_id = '7' ON DUPLICATE KEY UPDATE stream = VALUES(stream),form = VALUES(form);
@H_404_8@相反,它会将违规行的记录更新为查询的INSERT部分中指定的值.
参考文献:
> https://dev.mysql.com/doc/refman/5.7/en/replace.html
> https://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html根据新意图更新
为了在离开前一行时创建新记录,在使用INSERT之前,您需要首先使现有行上的UNIQUE约束无效.
目前在单个查询中没有方法可以使用MysqL.由于INSERT的限制,完成所需操作的最简单方法是在INSERT查询之前运行UPDATE查询.
UPDATE classes SET teacher_id = NULL WHERE teacher_id = '7'; INSERT INTO classes SET stream = 'Red',teacher_id = '7';
@H_404_8@这将首先检查冲突的teacher_id记录并将其设置为null.如果不存在冲突记录,则不会进行更新.然后,以下INSERT将创建所需的记录,而不会发生冲突.