如果数组元素尚不存在,如何将其插入到数组中

时间:2015-04-23 20:31:25

标签: 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                 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

我遇到的问题是将技术插入到数据库中。我发现第一步是:

  1. input.technologies中的元素插入technologies表格(如果它们尚不存在)。
  2. 我只能想象使用for循环或令人讨厌的东西来做这件事。

    我认为第二步是:

    1. technology_video_map回调中将新记录插入联结表connection.query,因为我们需要videoId
    2. 同样,我无法想象使用SQL执行此操作的惯用方法。有人可以指导我吗?

2 个答案:

答案 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 (..)

如果您没有使用存储过程,则触发查询以获取它。如果失败,则插入它。