仅当数组元素不存在时如何将它们插入数据库
How to insert array elements into db only if they do not already exist
这是我的数据库模式:
CREATE TABLE technologies (
technologyName VARCHAR(50) NOT NULL PRIMARY KEY
);
CREATE TABLE videos (
videoId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(300) NOT NULL,
url VARCHAR(300) NOT NULL,
description VARCHAR(300) NOT NULL,
channelName VARCHAR(300) NOT NULL
);
CREATE TABLE technology_video_map (
videoId INT,
technologyName VARCHAR(50),
PRIMARY KEY (videoId, technologyName),
FOREIGN KEY (videoId) REFERENCES videos(videoId),
FOREIGN KEY (technologyName) REFERENCES technologies(technologyName)
);
我希望用户提交视频:
var input = {
title: 'Grunt makes your web development better!',
url: 'https://www.youtube.com/watch?v=TMKj0BxzVgw',
description: 'If you\'re not using a task runner/build system like Grunt or Gulp...',
channelName: 'LearnCode.academy',
technologies: ['Grunt', 'JavaScript']
};
我想将它插入到数据库中。仅插入 视频对我来说很容易:
var technologies = input.technologies; // save for later
delete input.technologies;
connection.query('INSERT INTO videos SET ?', input, function (err, result) {
var videoId = result.insertId;
});
(connection
来自辉煌node-mysql)
我遇到的问题是将技术插入数据库。我确定第一步是:
- 将
input.technologies
中的元素插入到 technologies
table 中(如果它们尚不存在)。
我只能想象使用 for
循环或其他令人讨厌的东西来做到这一点。
第二步,我觉得是:
- 从
connection.query
回调中将新记录插入 table、technology_video_map
中,因为我们需要 videoId
。
同样,我无法想象使用 SQL 执行此操作的惯用方法。有人可以指导我吗?
你必须检查它是否存在
if not exists(select technologyName from technoligies
where technologyName='$technologies')
insert (..)
如果您没有使用存储过程,则触发一个查询来获取它。如果失败,则插入。
您可以使用 INSERT IGNORE 并加入您的 input.technologies 数组。这将插入不存在的记录并忽略已经存在的记录
var query = "INSERT IGNORE INTO technologies (technologyName) VALUES ('" + input.technologies.join("'),('") + "')";
这是我的数据库模式:
CREATE TABLE technologies (
technologyName VARCHAR(50) NOT NULL PRIMARY KEY
);
CREATE TABLE videos (
videoId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(300) NOT NULL,
url VARCHAR(300) NOT NULL,
description VARCHAR(300) NOT NULL,
channelName VARCHAR(300) NOT NULL
);
CREATE TABLE technology_video_map (
videoId INT,
technologyName VARCHAR(50),
PRIMARY KEY (videoId, technologyName),
FOREIGN KEY (videoId) REFERENCES videos(videoId),
FOREIGN KEY (technologyName) REFERENCES technologies(technologyName)
);
我希望用户提交视频:
var input = {
title: 'Grunt makes your web development better!',
url: 'https://www.youtube.com/watch?v=TMKj0BxzVgw',
description: 'If you\'re not using a task runner/build system like Grunt or Gulp...',
channelName: 'LearnCode.academy',
technologies: ['Grunt', 'JavaScript']
};
我想将它插入到数据库中。仅插入 视频对我来说很容易:
var technologies = input.technologies; // save for later
delete input.technologies;
connection.query('INSERT INTO videos SET ?', input, function (err, result) {
var videoId = result.insertId;
});
(connection
来自辉煌node-mysql)
我遇到的问题是将技术插入数据库。我确定第一步是:
- 将
input.technologies
中的元素插入到technologies
table 中(如果它们尚不存在)。
我只能想象使用 for
循环或其他令人讨厌的东西来做到这一点。
第二步,我觉得是:
- 从
connection.query
回调中将新记录插入 table、technology_video_map
中,因为我们需要videoId
。
同样,我无法想象使用 SQL 执行此操作的惯用方法。有人可以指导我吗?
你必须检查它是否存在
if not exists(select technologyName from technoligies
where technologyName='$technologies')
insert (..)
如果您没有使用存储过程,则触发一个查询来获取它。如果失败,则插入。
您可以使用 INSERT IGNORE 并加入您的 input.technologies 数组。这将插入不存在的记录并忽略已经存在的记录
var query = "INSERT IGNORE INTO technologies (technologyName) VALUES ('" + input.technologies.join("'),('") + "')";