仅当数组元素不存在时如何将它们插入数据库

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)

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

  1. input.technologies 中的元素插入到 technologies table 中(如果它们尚不存在)。

我只能想象使用 for 循环或其他令人讨厌的东西来做到这一点。

第二步,我觉得是:

  1. 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("'),('") + "')";