MySQL - 创建行并更新(如果已存在)
MySQL - make row and update if already exists
我有 table 4 列:Date, John, Frank, Anthony
我想制作一个表格,让这 3 个人每天都可以填写,并将这些值存储在数据库中。当约翰今天填写表格时,应该创建一个新行,其中包含今天的日期,以及他在数据库中的值。当弗兰克在 1 小时后(也就是同一天)填写表格时,他的值也应该插入到数据库中,但在同一行中,因为已经有一行包含今天的日期。但是当安东尼明天填写表格时,我应该用明天的日期创建一个新行。
简而言之:程序会检查今天是否有人填写了表格。如果是:它只是将值添加到填写者列中今天的现有行。如果不是:它会在今天的日期创建一个新行。
我已经写了这段代码,但问题是每次有人填写表格时它都会生成一个新行,并且只有当 $person 是第一个填写表格的人时才应该创建一行天.
$sql = "INSERT INTO table (Date, $name) VALUES (CURDATE(),'$values')";
尝试使用 REPLACE INTO 而不是使用 INSERT INTO。
首先确保 Date
字段是主键或唯一键。
然后你可以使用 ON DUPLICATE KEY UPDATE
$sql = "INSERT INTO table (Date, $name) VALUES (CURDATE(),'$values')
ON DUPLICATE KEY UPDATE $name='$values'";
但是你真的应该检查你的语言中的准备语句(PDO 在 PHP 的情况下)以防止 SQL 注入。
编辑
我刚刚重新阅读了这个问题 - 如果用户重新提交表单,OP 想要覆盖数据 - 我第一次阅读它时我以为他们想要保留原始数据
另一种选择[如果您只想保留原始数据],将使用 insert ignore
:请参阅此答案以了解 insert ignore
和 on duplicate key update
之间的比较:"INSERT IGNORE" vs "INSERT ... ON DUPLICATE KEY UPDATE"
尽管您可能应该将 table 设计更改为 'date'、'person'、'data',如另一个答案
中所建议
你应该改变你的 table。
而不是为每个人创建一个名称列,这样您就可以:
日期 |名称 |值
将日期和人员设为主键:
ALTER TABLE 'table' ADD PRIMARY KEY (Date,Name)
然后像这样插入:
INSERT INTO table (Date,Name,Values) VALUES (CURDATE(),'$name','$values') ON DUPLICATE KEY UPDATE Values='$values'
我有 table 4 列:Date, John, Frank, Anthony
我想制作一个表格,让这 3 个人每天都可以填写,并将这些值存储在数据库中。当约翰今天填写表格时,应该创建一个新行,其中包含今天的日期,以及他在数据库中的值。当弗兰克在 1 小时后(也就是同一天)填写表格时,他的值也应该插入到数据库中,但在同一行中,因为已经有一行包含今天的日期。但是当安东尼明天填写表格时,我应该用明天的日期创建一个新行。
简而言之:程序会检查今天是否有人填写了表格。如果是:它只是将值添加到填写者列中今天的现有行。如果不是:它会在今天的日期创建一个新行。
我已经写了这段代码,但问题是每次有人填写表格时它都会生成一个新行,并且只有当 $person 是第一个填写表格的人时才应该创建一行天.
$sql = "INSERT INTO table (Date, $name) VALUES (CURDATE(),'$values')";
尝试使用 REPLACE INTO 而不是使用 INSERT INTO。
首先确保 Date
字段是主键或唯一键。
然后你可以使用 ON DUPLICATE KEY UPDATE
$sql = "INSERT INTO table (Date, $name) VALUES (CURDATE(),'$values')
ON DUPLICATE KEY UPDATE $name='$values'";
但是你真的应该检查你的语言中的准备语句(PDO 在 PHP 的情况下)以防止 SQL 注入。
编辑
我刚刚重新阅读了这个问题 - 如果用户重新提交表单,OP 想要覆盖数据 - 我第一次阅读它时我以为他们想要保留原始数据
另一种选择[如果您只想保留原始数据],将使用 insert ignore
:请参阅此答案以了解 insert ignore
和 on duplicate key update
之间的比较:"INSERT IGNORE" vs "INSERT ... ON DUPLICATE KEY UPDATE"
尽管您可能应该将 table 设计更改为 'date'、'person'、'data',如另一个答案
中所建议你应该改变你的 table。
而不是为每个人创建一个名称列,这样您就可以:
日期 |名称 |值
将日期和人员设为主键:
ALTER TABLE 'table' ADD PRIMARY KEY (Date,Name)
然后像这样插入:
INSERT INTO table (Date,Name,Values) VALUES (CURDATE(),'$name','$values') ON DUPLICATE KEY UPDATE Values='$values'