Javascript 如何仅在数组元素不存在时将其插入数据库

Javascript 如何仅在数组元素不存在时将其插入数据库,javascript,mysql,sql,node.js,node-mysql,Javascript,Mysql,Sql,Node.js,Node Mysql,以下是我的数据库模式: 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

以下是我的数据库模式:

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;
});
连接
来自brilliant)

我遇到的问题是,将这些技术插入数据库。我已确定第一步是:

  • input.technologies
    中的元素插入
    technologies
    表(如果它们不存在)
  • 我只能想象使用
    for
    循环或一些令人恶心的东西来实现这一点

    我认为第二步是:

  • 在连接表中插入一条新记录,
    technology\u video\u 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("'),('") + "')";
    

    它不应该是“如果不存在”而没有感叹号吗?我从来不知道它存在。谢谢。我不知道插入忽略,所以谢谢你。这不容易受到SQL注入的攻击吗?如果是,在这种情况下如何防止SQL注入?insert ignore本身不易受到SQL注入的攻击。如果将查询放入
    连接中,节点mysql已经执行转义。query('SELECT blah FROM blahblah WHERE blah=?',myString,function(err,result){})
    。您还可以直接转义input.technologies。有关更多详细信息,请参阅此链接