我有一个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

这是trap .我被困住了,不知道该怎么做.我一次要插入/更新多行.请给我一个方向.谢谢

推荐答案

从MySQL 8.0.19开始,您可以为该行使用别名(参见reference).

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

对于早期版本,使用关键字VALUES (参见reference,MySQL 8.0.20不推荐使用).

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

Mysql相关问答推荐

MySQL 8.0.28覆盖(和函数)索引未使用

子查询是否可以按主查询中的列进行分组?

MySQL match against给出奇怪的结果

MySql SELECT 查找包含数字的区间的时间复杂度是多少?

Mysql 中相同列的相关 2 查询

Mysql,显示谁已经和没有 Select 退出巴士服务

MySQL 使用了错误的索引

SQL / MySQL:如何在WHERE IN中判断类似于OR的AND逻辑

为什么这个 NOT NULL 到 NULL 迁移会触发大量 I/O 操作?

更新和替换未加引号的 JSON 字符串

更改整数时间到日期格式 MM/DD/YY,如 python 中的 datetime.fromtimestamp

判断一对记录是否属于多个组ID

没有 JDBC 类型的方言映射:1111

如何在 MySQL 中 Select 字段具有最小值的数据?

如何在mysql中连接整数(整数和整数)和varchar(nvarchar和varchar)等数据类型?

ASP.NET EntityFramework 获取数据库名称

从mysql中的大表中快速 Select 随机行

由于在 MySQL 中使用保留字作为表名或列名导致的语法错误

#1030 - 从存储引擎 Aria 收到错误 176读取错误校验和的页面

当运行 UPDATE ... datetime = NOW();所有更新的行都会有相同的日期/时间吗?