MySQL - 如果已存在则进行行和更新

时间:2015-01-28 19:54:58

标签: php mysql date row

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

我想制作一个可以由这3个人每天填写的表格,并将这些值存储在数据库中。当John今天填写表单时,应该创建一个新行,其中包含今天的日期,以及他在数据库中的值。当Frank在1小时后填写表单时(同一天),他的值也应该插入到数据库中,但是在同一行中,因为已经有了今天的日期行。但是当安东尼明天填写表格时,我应该用明天的日期创建一个新的排名。

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

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

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

4 个答案:

答案 0 :(得分:3)

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

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

但是你真的应该检查你的语言准备好的语句(如果是PHP,PDO),以防止SQL注入。

答案 1 :(得分:3)

你应该改变你的桌子。

而不是每个人的列都会创建一个名称列,以便您拥有:

日期|名称|值

将日期和人物作为主键:

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

然后插入如下:

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

修改

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

另一种选择[如果您只想保留原始数据],将使用insert ignore:请参阅此答案,以便在insert ignoreon duplicate key update之间进行比较:{{3} }

虽然您应该将表格设计更改为“日期”,“人物”,“数据”,如另一个答案所示