首页 文章

MySQL ON DUPLICATE KEY UPDATE用于在单个查询中插入多行

提问于
浏览
162

我有一个SQL查询,我想在单个查询中插入多行 . 所以我使用了类似的东西:

$sql = "INSERT INTO beautiful (name, age)
  VALUES
  ('Helen', 24),
  ('Katrina', 21),
  ('Samia', 22),
  ('Hui Ling', 25),
  ('Yumie', 29)";

mysql_query( $sql, $conn );

问题是,当我执行此查询时,我想检查是否 UNIQUE 键(不是 PRIMARY KEY ),例如上面的 'name' ,应该检查,如果这样的 'name' 已经存在,则应该更新相应的整行,否则插入 .

例如,在下面的示例中,如果数据库中已存在 'Katrina' ,则应更新整个行,而不考虑字段数 . 如果 'Samia' 不存在,则应再次插入行 .

我想过使用:

INSERT INTO beautiful (name, age)
      VALUES
      ('Helen', 24),
      ('Katrina', 21),
      ('Samia', 22),
      ('Hui Ling', 25),
      ('Yumie', 29) ON DUPLICATE KEY UPDATE

这是陷阱 . 我陷入困境,对如何继续感到困惑 . 我有多行要一次插入/更新 . 请给我一个指示 . 谢谢 .

3 回答

  • 397

    使用关键字 VALUES 来引用新值(请参阅documentation) .

    INSERT INTO beautiful (name, age)
        VALUES
        ('Helen', 24),
        ('Katrina', 21),
        ('Samia', 22),
        ('Hui Ling', 25),
        ('Yumie', 29)
    ON DUPLICATE KEY UPDATE
        age = VALUES(age),
         ...
    
  • 0

    您可以使用Replace而不是INSERT ... ON DUPLICATE KEY UPDATE .

  • 0

    INSERT INTO ... ON DUPLICATE KEY UPDATE仅适用于MYSQL,不适用于SQL Server .

    对于SQL Server,解决此问题的方法是首先声明临时表,将值插入该临时表,然后使用MERGE

    像这样:

    declare @Source table
    (
    name varchar(30),
    age decimal(23,0)
    )
    
    insert into @Source VALUES
    ('Helen', 24),
    ('Katrina', 21),
    ('Samia', 22),
    ('Hui Ling', 25),
    ('Yumie', 29);
    
    
    MERGE beautiful  AS Tg
    using  @source as Sc
    on tg.namet=sc.name 
    
    when matched then update 
    set tg.age=sc.age
    
    when not matched then 
    insert (name, age) VALUES
    (SC.name, sc.age);
    

相关问题