【问题标题】:How to not insert two of the same values如何不插入两个相同的值
【发布时间】:2020-01-16 21:21:38
【问题描述】:

我正在使用输入来允许用户从他们的计算机中选择文件并将其添加到列表中。我通过使用 promise 加载文件并创建一组 promise 并将其添加到我的状态来做到这一点

反应 JS

this.state = {
  files: [],
};

const readFile = (file) => {

    const fileReader = new FileReader();

    return new Promise((resolve, reject) => {

      fileReader.onerror = (error) => {
        reject({ error })
      }

       fileReader.onload = (e) => {
        resolve({
          name: file.name.replace( /_|\.mp3/gi, " "),
          link: e.target.result,
          id: id++,

        })
      }

      fileReader.readAsDataURL(file);

    })
  }
  const allReaders = Array.from(event.target.files).map(readFile)

  Promise.all(allReaders)
    .then(fileList => {
      console.log(this.state.files)
      this.setState({ files: fileList });
    })
    .catch(error => {
       console.error(error)
    });


}

然后我通过我的文件数组进行映射,以将这些文件添加到文本输入列表中。他们还能够重新排序列表以及更改每个列表项的文本。

之后,他们将能够使用按钮将列表信息保存到数据库中。

反应 JS

save(event) {
   event.preventDefault();
   let files = this.state.files;

let data = files.map(( { name }  , index) => ({ name, index : index }));


 let request = new Request('http://localhost:3000/songs', {
    method: 'POST',
    headers: new Headers({ 'Content-Type': 'application/json' }),
    body: JSON.stringify(data)
  });

       fetch(request)
      .then((response) =>
        response.json())
          .then((data) => {
          })
          .catch((error) => {
            console.log(error)
          })

}

节点 JS

*queries.js*
const addSong = (request, response) => {
  const id = parseInt(request.params.id)
  const { name, link, index } = request.body;

for (var i = 0; i < request.body.length; i++) {
  pool.query('INSERT INTO songs (name, link, index) VALUES ($1, $2, $3) RETURNING *', [request.body[i].name, request.body[i].link, request.body[i].index], (error, results) => {
  if (error) {
    throw error
    console.log(error)
  } else {
    console.log("Rows " + JSON.stringify(results.rows));

  }
 });
}
}

*index.js*
const app = express();
const db = require('./queries');
app.post('/songs', db.addSong)

它可以工作,但如果我单击保存两次,它会将相同的数据保存到数据库中。我想如果它包含与另一个对象相同的索引,我想要做的是不保存该对象。

【问题讨论】:

    标签: sql node.js reactjs postgresql sql-insert


    【解决方案1】:

    如果您想防止列 index 出现重复(顺便说一下,这不是一个很好的列名,因为它在几乎所有 RDBMS 中都是保留的),您可以简单地添加一个 unique 约束在那一栏:

    ALTER TABLE songs ADD CONSTRAINT song_unique_index UNIQUE ("index");
    

    如果尝试创建副本,数据库将引发错误。在 Postgres 中,您甚至可以使用方便的子句 ON CONFLICT 来管理查询中的错误。

    例如,您可以像这样简单地忽略此特定列上的重复错误:

    INSERT INTO songs (name, link, index) 
    VALUES ($1, $2, $3) 
    ON CONFLICT (song_unique_index) DO NOTHING
    RETURNING *
    

    不会插入重复项,也不会引发错误。

    【讨论】:

    • 我喜欢这个,只是它会停止我的服务器并阻止我添加不属于同一索引的文件。
    • @DDavis25:在这种重复的情况下你想做什么?
    • 好吧,我不想保存具有相同索引的对象,但如果它们没有相同的索引,我想将这些文件添加到数据库中。
    • @DDavis25:我用ON CONFLICT 子句的例子更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    • 2018-04-19
    • 1970-01-01
    • 2016-06-17
    • 1970-01-01
    相关资源
    最近更新 更多