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