【问题标题】:MySql - Insert only if some fields are not insered yetMySql - 仅在某些字段尚未插入时才插入
【发布时间】:2011-01-26 15:41:27
【问题描述】:

我有一个 MySql 表,包含 field1(id)、field2(name) 和 field3(surname)。

只有当字段 2 和字段 3 对尚未插入时,我才希望插入该值。我该怎么做?

INSERT IGNORE 不起作用,因为 field1 是 int autoincrement 并且每个 INSERT 都不同。

附:我想摆脱 REPLACE INTO,因为如果它已经存在,“重写”数据是没有意义的

干杯

编辑

表结构 id = INT 初级 名称 = VARCHAR 姓氏 = VARCHAR

name 和 surname 不能是每个 UNIQUE(我可以有 2 个 name 或 surname 具有相同的值)。我想要的是这对名称和姓氏的值不同。

es :

0 马可·科迪(OK)

1 Marco Daghine (OK)

2 法比奥·科尔迪 (OK)

3 Marco Cordi(不行,已定义)

【问题讨论】:

    标签: mysql


    【解决方案1】:

    如果有人为您回答这个问题,您需要发布您的实际表结构(包括任何存在的主键/唯一键)。

    如果您的表没有主键/唯一键,那么执行此操作的唯一方法是运行 SELECT 并查看是否返回任何行,如果没有找到行则执行 INSERT。

    如果您希望表中的行在字段 2 和字段 3 上是唯一的,那么您应该在这些列上创建唯一索引(可以使用 ALTER TABLE 查询来完成)。

    编辑:您需要一个唯一索引,而不是单独在每个字段上,而是在两个字段上。你想运行这个查询:

    ALTER TABLE `yourtable`
    ADD UNIQUE INDEX `unique_name` (`field2`, `field3`);
    

    完成此操作后,您可以使用 INSERT IGNORE。

    【讨论】:

    • 添加了更多信息!看看吧
    • 已编辑 - 涵盖两列的单个唯一索引将完全符合您的要求!
    • 嗯好的,拍的不错!但是通过这种方法,我有一个 VARCHAR 元素的键。不是更好地在一个键上只有 INT 并使用替换成吗?在计算时间方面,我的意思是:)
    • “更好” - 不,它不应该有任何负面影响。这正是唯一索引的目的。完成同样事情的任何其他方法都会“更糟”。
    • 嗯...但是 John K. 的解决方案比放置 UNIQUE 键更高效,不是吗?
    【解决方案2】:
    update myTable
    set name = coalesce(name, 'newname'), 
    surname = coalesce(surname, 'newsurname') 
    where id = myID;
    

    (更新)

    insert into myTable(name, surname) 
    values ('newname', 'newsurname') 
    where NOT EXISTS (select id from myTable where name = newname and surname = surname) ; 
    

    【讨论】:

    • 如果字段还没有条目,我假设您的意思是更新。
    • ???我没有 ID...如果名称和姓氏值已经插入,我只需要在表中搜索。否则,我把它们放在 DB 上。
    • 如果你的意思是字面意思...仅当“两个”字段为空时才更新,那么它将是:更新 myTable set name = 'newname', surname = 'newsurname' where id = myID and name is null 和 surname 为 null ;
    • 哦...我明白了...然后它将插入到 myTable(name, surname) 值 ('newname', 'newsurname') 中,其中 id 不在 (select id from myTable where name > '' 和姓氏 > '') ;
    • 嗯好的,所以在这种情况下最好使用 Replace Into :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-28
    • 2018-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多