【问题标题】:MySQL - make row and update if already existsMySQL - 如果已经存在,则创建行并更新
【发布时间】:2015-01-28 19:54:57
【问题描述】:

我有 4 列的表格:Date, John, Frank, Anthony

我想制作一个可以由这三个人每天填写的表格,并将这些值存储在数据库中。当 John 今天填写表格时,应该使用今天的日期创建一个新行,并使用他在数据库中的值。当弗兰克在 1 小时后(即同一天)填写表格时,他的值也应该插入到数据库中,但在同一行中,因为已经有一行包含今天的日期。但是当 Anthony 明天填写表格时,我应该使用明天的日期创建一个新行。

简而言之:程序会检查今天是否有人已经填写了表格。如果是:它只是将值添加到填写它的人的列中今天的现有行。如果不是:它用今天的日期创建一个新行。

我已经写了这段代码,但问题是每次有人填写表格时它都会创建一个新行,并且只有当 $person 是当天第一个填写表格的人时才应该创建一个行。

$sql = "INSERT INTO table (Date, $name) VALUES (CURDATE(),'$values')"; 

【问题讨论】:

  • 所以请不要杀我”好吧,我不会(这次)
  • 这有点糟糕数据库设计
  • 新数据库架构:日期 |谁|什么。以及日期和谁的唯一索引

标签: php mysql date row


【解决方案1】:

首先确保Date 字段是主键或唯一键。 然后你可以使用ON DUPLICATE KEY UPDATE

$sql = "INSERT INTO table (Date, $name) VALUES (CURDATE(),'$values') 
        ON DUPLICATE KEY UPDATE $name='$values'"; 

但您确实应该检查您的语言中的准备好的语句(在 PHP 的情况下为PDO)以防止 SQL 注入。

【讨论】:

  • 如果我错了,请纠正我,但我认为仅将日期作为主键是行不通的。在这种情况下,主键应该由日期组成,因为每个人每天应该只有一个条目。
  • 我刚刚回答了这个问题。而且他只有日期作为主键。我不判断他的实施意义。
  • 我了解您部分回答了他的问题;但是,您的解决方案仍然不起作用,因为他将无法每天添加多个人员条目,他确实表示他需要。按照您编写的方式,如果他将日期设为主键,则每天只能添加一个条目。指出此类错误是 SO 社区的工作,以便发帖人在正确的轨道上发送。
  • 请再读一遍他的问题。他每天只想要一排。
  • 确认,错过了。对不起,你是对的。对困惑感到抱歉。干杯。
【解决方案2】:

你应该改变你的桌子。

不要为每个人创建一个列,而是创建一个名称列,这样你就有了:

日期 |姓名 |价值观

将日期和人设为主键:

ALTER TABLE 'table' ADD PRIMARY KEY (Date,Name)

然后像这样插入:

INSERT INTO table (Date,Name,Values) VALUES (CURDATE(),'$name','$values') ON DUPLICATE KEY UPDATE Values='$values'

【讨论】:

    【解决方案3】:

    尝试使用 REPLACE INTO 而不是使用 INSERT INTO。

    【讨论】:

    • 这不起作用,因为它总是替换前一行,即使它是另一天。如果是第二天,它应该创建一个新行。
    • 那么你应该添加超过 1 个键。
    • 添加多于 1 个键是什么意思?
    • 如果日期相同,您想更新而不是插入,对吗?如果是这种情况,您应该将其设为键,因为 SQL 将根据查找重复键进行更新。所以制作你的两个钥匙,它会更新。如果日期发生变化,那么它将插入。
    【解决方案4】:

    编辑

    我只是重新阅读了这个问题——如果用户重新提交表单,OP 想要覆盖数据——我第一次阅读它时,我以为他们想保留原始数据

    另一种选择 [如果您只想保留原始数据],将使用 insert ignore:查看此答案以比较 insert ignoreon duplicate key update"INSERT IGNORE" vs "INSERT ... ON DUPLICATE KEY UPDATE"

    尽管您可能应该按照另一个答案的建议将表格设计更改为“日期”、“人”、“数据”

    【讨论】:

    • 这将完全丢弃该语句。但他希望添加信息,但不是在新行中,而是在当前行中。
    • 是的,只是重新阅读问题,第一次把它倒过来:P
    猜你喜欢
    • 2012-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多