【问题标题】:Inserting if not exist or Updating if exist PHP如果不存在则插入或更新如果存在 PHP
【发布时间】:2021-02-04 09:06:09
【问题描述】:

如果表中的值不是同一行,我想插入,但是如果存在具有相同值的行,我只想更新一个将 +1 添加到当前值的行。我有当前代码,但它似乎没有更新存在的行中的值。

INSERT INTO raport(id, wykonawca, tytul, czas_trwania, powtorzenia) 
        VALUES('','$wykonawca2','$tytul2','$czas_trwania2', '$powtorzenia2') 
        ON DUPLICATE KEY UPDATE wykonawca='$wykonawca2', tytul='$tytul2', czas_trwania='$czas_trwania2', 
        powtorzenia='$powtorzenia2'+1

【问题讨论】:

  • 哪一列是关键?
  • @jemeson 2012 powtorzenia
  • 有什么事吗?是否有任何错误信息? powtorzenia='$powtorzenia2'+1 可能应该是 powtorzenia=powtorzenia+1 添加花括号怎么样:wykonawca='{$wykonawca2}'wykonawca="{$wykonawca2}"。您还应该在INSERT INTO 部分中定义id,否则没有要更新的id。 (您使用id 检查相似性,而不是其他值,如 wykonawca 或 tytul。)
  • 我看不到 sql 有任何明显错误(除了大量的 sql 注入问题)。这表明您没有传递您认为的数据。您需要进行一些调试并根据您的发现更新问题,并且可能需要更多代码,例如调用查询的位置以及它拥有什么数据/从哪里获取它
  • 另外,您确定这是您的密钥吗(例如,数据库密钥不仅仅是您要检查的信息),因为通常不会更改关键点关系 - 如果powtorzenia 是关键,然后你更新它,那么你必须更新每个其他表中对它的每个引用。我怀疑你的表会自动增加 id?而且我怀疑这是每次插入时永远不会重复的实际密钥。但我可能是错的

标签: php mysql


【解决方案1】:

确保您的表有一个声明为 UNIQUE 或 PRIMARY KEY 的列,并且不是自动增量列

如果您指定 ON DUPLICATE KEY UPDATE 子句并且要插入的行会导致 UNIQUE 索引或 PRIMARY KEY 中的重复值,则会发生旧行的 UPDATE。例如,如果列 a 被声明为 UNIQUE 并且包含值 1,则以下两个语句具有相似的效果:

INSERT INTO t1 (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;
UPDATE t1 SET c=c+1 WHERE a=1;

(对于 a 是自增列的 InnoDB 表,效果不同。对于自增列,INSERT 语句会增加自增值,但 UPDATE 不会。)

MySQL Reference

编辑: 您的 id 列是空的,您需要传递一个值

【讨论】:

  • 为什么它应该是'不是自动增量列'
  • @jameson2012 将新记录插入数据库时​​,自动递增列会自动用值填充指定的列。 (表上最后一条记录中的值+1)
  • 我想要自动增量列。我已经为 powtorzenia 添加了一个唯一的密钥。
  • 是的,我知道自动增量是做什么的,已经在生产中使用了很多年,但我不明白在这种情况下这有什么关系?
  • 创建表时,只需将 PRIMARY KEY 和 AUTO_INCREMENT 添加到列示例:CREATE TABLE users (id int AUTO_INCREMENT PRIMARY KEY .....
【解决方案2】:

关于为什么行不更新的最初问题的实际答案是因为您没有为 PRIMARY KEY 传递值 - 这是您的 AUTO-INCREMENT id 列。

每次通过:

VALUES('','$wykonawca2','$tytul2','$czas_trwania2', '$powtorzenia2') 

这意味着您的 id 列是空白的,因此没有重复的只是一个新行。如果你想要ON DUPLICATE KEY UPDATE,你需要传入 id。

有关处理多个索引和重复更新的方法的更多信息,请查看以下问题:MySQL behavior of ON DUPLICATE KEY UPDATE for multiple UNIQUE fields

此外,您应该尽快阅读并采取行动,您不应该将变量直接传递到 sql - 它已经过时且非常不安全:

How can prepared statements protect from SQL injection attacks?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 2016-05-15
    • 1970-01-01
    • 2019-10-17
    • 2012-12-13
    • 2012-12-17
    相关资源
    最近更新 更多