gpt4 book ai didi

php - 当 2 列必须匹配唯一行时在 MySQL 数据库中使用 REPLACE INTO

转载 作者:太空宇宙 更新时间:2023-11-03 11:14:02 25 4
gpt4 key购买 nike

我想要一个包含 3 个字段的表,并使用 REPLACE 更新此表以覆盖行,而不是在其中 2 个字段匹配后续添加时创建新行。

换句话说,我想对包含行“a”、“b”和“c”的“表”执行这样的操作-

REPLACE INTO table SET c = $var_c WHERE a = $var_b AND b=$var_b

因此它会检查是否有一行 a AND b 匹配,如果还没有要更新的行,则只将 c 写入新行。 (抱歉说的很明显)

这是我所做的,而不是使用 REPLACE。这段代码实现了我所需要的,但我相信有一种更有效的方法可以做到这一点。谢谢

$query1 = "SELECT COUNT(*) FROM table WHERE a = $var_a AND b = $var_b";
$result = @mysql_query ($query1);
$num = mysql_fetch_row($result);
if($num[0] != 0) {
$query = "UPDATE table SET c = $var_c WHERE a = $var_a AND b = $var_b";
}
else {
$query = "INSERT INTO table VALUES ($var_a, $var_b, $var_c)";
}
$result = @mysql_query ($query);
if (!$result) {
die('Invalid query: ' . mysql_error());
}

最佳答案

我建议完全不要使用 REPLACE;一般来说,我更喜欢 INSERT INTO ... ON DUPLICATE KEY UPDATE。REPLACE 表示 DELETE,而不是 INSERT。这对于带有 ON DELETE CASCADE 子句的外键约束尤其危险。假设你必须要表

CREATE TABLE parent(
id TINYINT UNSIGNED NOT NULL,
data VARCHAR(255) NOT NULL,
PRIMARY KEY( id )
) Engine = InnoDB;
CREATE TABLE child(
id TINYINT UNSIGNED NOT NULL,
parent_id TINYINT UNSIGNED NOT NULL,
PRIMARY KEY( id ),
FOREIGN KEY( parent_id ) REFERENCES parent( id ) ON DELETE CASCADE
) Engine = InnoDB;

在父表上运行 REPLACE 会默默地从子表中删除所有引用记录。是的,这有点需要,因为您说的是“ON DELETE CASCADE”。您仍然必须记住 REPLACE 可能是危险的。另一方面,“ON DELETE NO ACTION”将意味着您的 REPLACE 将失败,这似乎没有合理的理由。最后 - IMO - 删除和插入相同的记录没有意义,通常 INSERT INTO ... ON DUPLICATE KEY UPDATE 是你真正想要和需要的。

关于php - 当 2 列必须匹配唯一行时在 MySQL 数据库中使用 REPLACE INTO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6570014/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com