【问题标题】:MySQL - Insert only when certain value does not existMySQL - 仅在某个值不存在时插入
【发布时间】:2018-01-17 23:23:51
【问题描述】:

假设我有这张桌子

ID  |   Name    |   Hobby
---------------------------
1   |   Alex    |   fishing
2   |   Alex    |   soccer
3   |   Nick    |   bike
4   |   George  |   hike

ID - 是独一无二的。 Hobby - 不是唯一的(需要保持非唯一)

插入记录:

INSERT INTO my_table (ID, Name, Hobby) VALUES ('5', 'Christina', 'bike')

如果bike值在Hobby列中根本不存在,如果我需要插入记录,如何修改查询?

另一种说法:

  • VALUES ('5', 'Christina', 'bike') - 不会因为 3 | Nick | bike 存在而插入
  • VALUES ('5', 'Christina', 'cooking') 将被插入,因为 cooking 根本不存在于 Hobby 列中。

拥有包含数千条记录的现有数据库,Hobby 中可能存在重复...

但是从现在开始..添加新记录时,如果已经存在,我想避免添加..

谢谢。

【问题讨论】:

  • where not exists (Select * from my_table B where hobby = 'bike' and A.hobby=b.hobby)。并将外部 my_table 别名为 A。
  • 嗯,这就是 UNIQUE 的作用?!?!?!?!?但是您可以通过连接来模拟这种奇怪的行为
  • @xQbert: 可以用VALUES 代替 select 吗?
  • @Strawberry 你能举个具体的例子吗?
  • 也许吧。如果您提供了 CREATE 和 INSERT 语句 (meta.stackoverflow.com/questions/333952/…)

标签: mysql


【解决方案1】:

基于MySQL: Insert record if not exists in table

但有一些更正(修复重复的错误)

以下查询对我有用。

INSERT INTO my_table (ID, Name, Hobby)
SELECT * FROM (SELECT '5' AS ID, 'Christina' AS Name, 'cooking'  AS Hobby) AS tmp
WHERE NOT EXISTS (
    SELECT name FROM table_listnames WHERE Hobby= 'cooking'
) LIMIT 1;

【讨论】:

  • 这是不正确的。你容易并发。另一个进程可以插入同一行。您想要的功能工作的唯一方法是在几列上放置一个唯一约束。由于您的列是基于文本的,因此正确的解决方案是使用触发器、连接文本值、散列它们并将散列与数据一起插入。将unique 约束放在这一列上,您就不会遇到问题。或者,您可以使用这种易于并发的 falsy 解决方案。
  • @Mjh:在这里投影简单的数据库示例......我有一个现有的数据库(数千条记录),并且我有在 Hobby 中复制的风险......但从现在开始......考虑到我不会再添加重复项,我需要对其进行更改。这里有什么不清楚的地方?
  • @Mjh:我对上面的查询没问题,我没有任何其他会改变表格的处理
【解决方案2】:

最简单的解决方案可能是将爱好栏更改为唯一栏。这样,您将强制您的数据库仅插入独特的爱好。另一种解决方案可能是在插入/更新之前使用触发器。

【讨论】:

  • @ihtus 那么解决方案可能是使用触发器。我使用触发器在插入之前和更新之前检查重复项。
  • 我期待另一个更优雅的解决方案.. 没有触发器的任何东西?
  • @ihtus 你能解释一下为什么你不想使用触发器吗?
  • @Mjh:在这里投射简单的数据库示例......我有一个现有的数据库(数千条记录),并且我有在 Hobby 中复制的风险......但从现在开始......考虑到我不会添加重复项,我需要对其进行更改
  • @ihtus 如果您不再需要任何重复项,则必须使用触发器。这将防止数据库插入重复的插入和更新。仍然不知道您为什么不想使用触发器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-28
  • 2018-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多