Mysql SQL-仅使用一个请求插入多个条目而不重复

Mysql SQL-仅使用一个请求插入多个条目而不重复,mysql,insert,duplicates,Mysql,Insert,Duplicates,我想做的是: 在现有表中:“用户” 如果条目尚不存在,请插入一个新条目 到目前为止,我在PHP中尝试了以下内容: INSERT INTO `users` (`ID`, `NAME`, `CREATIONDATE`) SELECT NULL, '$name', CURRENT_TIMESTAMP FROM users WHERE NOT EXISTS( SELECT users.NAME FROM users WHERE users.NAME = '$name' ) 这段代码有

我想做的是:

  • 在现有表中:“用户”
  • 如果条目尚不存在,请插入一个新条目

到目前为止,我在PHP中尝试了以下内容:

INSERT INTO `users` (`ID`, `NAME`, `CREATIONDATE`)
SELECT NULL, '$name', CURRENT_TIMESTAMP
FROM users
WHERE NOT EXISTS(
   SELECT users.NAME FROM users
   WHERE users.NAME = '$name'
)
这段代码有效;我有没有重复的新条目


问题是:

为了更简洁和节省请求数量,我只想构建一个请求,以避免在PHP循环中执行
X INSERT-INTO

例如:


我的建议是对列名使用唯一约束,并执行以下查询

将值(1、名称1、, 1-2-3),(2,名称2,1-2-3),(3,名称3,1-2-3)


此查询将是原子查询。这意味着,如果违反了完整性约束,则不会插入任何行

为什么不使用Insert ignore into?嗨,Praveen,谢谢你的回答。事实上,您的解决方案是有效的,但新的问题是,正如您刚才所说,即使我的PHP尝试添加,例如,100行,如果100行中只有一行是新的,那么整个请求都会被拒绝……太接近了!哦,是的,我刚刚找到了解决方案,我只是把你的解决方案和Farhan Qasim的评论混合在一起,效果很好。(名称上的唯一索引+插入忽略)很高兴知道您找到了解决方案
foreach ( $list as $name )
{
   $sql = "INSERT INTO `users` (`ID`, `NAME`, `CREATIONDATE`)";
   $sql .="SELECT NULL, '$name', CURRENT_TIMESTAMP FROM users
   WHERE NOT EXISTS(
       SELECT users.NAME FROM users
       WHERE users.NAME = '$name'
   )
   );
   $rq = $pdo->prepare ( $sql );
   $rq->execute ();
 }