这是我的数据库架构:
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
表格(如果它们尚不存在)。我只能想象使用for
循环或令人讨厌的东西来做这件事。
我认为第二步是:
technology_video_map
回调中将新记录插入联结表connection.query
,因为我们需要videoId
。 同样,我无法想象使用SQL执行此操作的惯用方法。有人可以指导我吗?
答案 0 :(得分:3)
您可以使用INSERT IGNORE并加入input.technologies数组。这将插入不存在的记录,并将忽略已存在的记录
var query = "INSERT IGNORE INTO technologies (technologyName) VALUES ('" + input.technologies.join("'),('") + "')";
答案 1 :(得分:0)
你必须检查它的存在
if not exists(select technologyName from technoligies
where technologyName='$technologies')
insert (..)
如果您没有使用存储过程,则触发查询以获取它。如果失败,则插入它。