【问题标题】:How do I use ONLY ONE sql query for conditional insert?如何仅使用一个 sql 查询进行条件插入?
【发布时间】:2013-08-10 13:26:48
【问题描述】:

我正在为我的 Java 应用程序使用摆动菜单。我也有 MySQL 数据库。数据库中的一个表中有一个列(名为 brind),它必须具有唯一值(除了自动插入值的 ID 列)。因此,通过我的 JFrame 表单上的文本字段,我将尝试在该表中插入一些值,但前提是该 brind 值不存在于表中(即列中)。我只需要一个 mysql 查询,称之为条件插入。我该怎么做呢? 谢谢

【问题讨论】:

  • 如果您尝试在唯一列中添加非唯一值,查询将通过异常。只需处理该异常。或者,启动一个事务,检查值是否存在,如果不存在,插入并提交。否则,回滚。

标签: sql insert conditional-statements not-exists


【解决方案1】:

如下查询应该满足您的要求:

INSERT INTO `thetable`
    SELECT 'values', 'to', 'insert' 
    WHERE NOT EXISTS (
        SELECT * 
        FROM `thetable`
        WHERE brind='whatever'
    )

values,to,insert 应替换为您正在插入的字段的值。

但是,这里的其他一些建议会更好地为您服务,例如

  1. 首先检查该值,如果存在则不要插入(在一个事务中执行此操作以处理并发问题,假设您的事务隔离设置正确),
  2. 尝试插入并处理违反唯一约束的失败。

在我看来,选项 2 是一个不错的选择。

【讨论】:

    【解决方案2】:
    REPLACE INTO myTable
    SET brind = 'someValue'
    

    我认为你有一个数据库设计问题。如果列 brid 必须是唯一的,则它可能应该用作主键。

    【讨论】:

    • 我不相信这会像 OP 所描述的那样,因为它将替换一个确实存在的值,而不是在该值已经存在的情况下失败。虽然同意设计问题。
    • 我也想过制作 brind 主键,但是给了我一个现成的数据库,所以我不能更改它。
    【解决方案3】:

    将尝试在该表中插入一些值,但前提是该 brind 值不存在于表中(即列中)

    这可以在数据库级别和应用程序级别完成。

    因为数据库级别是最简单、最安全的。在该列上创建索引并使其唯一(而不是标识符!),如果该值已经存在,数据库将不会插入。 Here 是怎么做的。

    应用程序级别:您将缓存具有数据库的内容并锁定表,不允许其他应用程序修改它。如果需要,插入它并解锁表格。

    我建议第一个解决方案

    【讨论】:

      猜你喜欢
      • 2013-05-14
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 2020-08-28
      • 1970-01-01
      • 2021-08-29
      相关资源
      最近更新 更多