WordPress 和 SQL - 如果列值不存在,则从另一个表更新和插入

Posted

技术标签:

【中文标题】WordPress 和 SQL - 如果列值不存在,则从另一个表更新和插入【英文标题】:WordPress and SQL - Update and Insert from another table if column value doesn't exist 【发布时间】:2015-05-02 00:02:21 【问题描述】:

为我的 wordpress 网站使用了一些 mysql。都在 1 DB 以内。

我正在尝试从wp_2_options(多站点)更新wp_options 表。

它们都有 option_name (unique_key) 和 option_value

如果option_name已经存在于wp_2_options表中,则需要更新wp_options表中的option_value

如果option_name 不存在,则插入来自wp_2_options 的行。

那么我如何UPDATE 和`INSERT 使用 UNIQUE KEY 值而不是 PRIMARY KEY

我该怎么做?

两者的结构相同

wp_options ( option_id bigint(20) unsigned NOT NULL AUTO_INCREMENT, option_name varchar(64) NOT NULL DEFAULT '', option_value longtext NOT NULL, autoload varchar(20) NOT NULL DEFAULT 'yes', PRIMARY KEY (option_id), UNIQUE KEY option_name (option_name) ) ENGINE=InnoDB AUTO_INCREMENT=1402 DEFAULT CHARSET=utf8;

提前致谢


更新:

最终使用此 INSERT 然后 UPDATE。这对我有用。 现在将通过 php 使用它。

-- Adding completely new rows from wp_2_options into wp_options INSERT IGNORE INTO wp_options SELECT * FROM wp_2_options WHERE option_name NOT IN (SELECT option_name FROM wp_options);

-- Updating the option_name field in wp_options, if that got changed in wp_2_options UPDATE wp_options JOIN wp_2_options ON wp_options.option_name = wp_2_options.option_name SET wp_options.option_value = wp_2_options.option_value;

【问题讨论】:

【参考方案1】:

您无需执行任何操作,索引将为您完成工作。

只需执行 INSERT,然后执行 UPDATE。

如果存在,则 INSERT 将失败,UPDATE 将执行更新。

如果不存在,INSERT 会将其放在那里,而 UPDATE 不会影响任何行。

如果我理解正确, 像这样:

$sql = "SELECT `option_value`,`option_name` FROM `wp_options2` WHERE 1";
$result = mysqli_query($link, $sql);
while($row = mysqli_fetch_array($result, MYSQLI_NUM))
  $sql = "INSERT INTO `wp_options`(`option_value`,`option_name`) VALUES( '$row[0]','$row[1]')";
  mysqli_query($link, $sql);
  $sql = "UPDATE `wp_options` SET `option_value` = '$row[0]' WHERE `option_name` = '$row[1]";
  mysqli_query($link, $sql);

如果您需要更温暖的模糊感,请使用一些错误检测:

$sql = "SELECT `option_value`,`option_name` FROM `wp_options2` WHERE 1";
$result = mysqli_query($link, $sql);
while($row = mysqli_fetch_array($result, MYSQLI_NUM))
  $sql = "INSERT INTO `wp_options`(`option_value`,`option_name`) VALUES( '$row[0]','$row[1]')";
  mysqli_query($link, $sql);
  $rows =  mysqli_affected_rows($link);
  $sql = "UPDATE `wp_options` SET `option_value` = '$row[0]' WHERE `option_name` = '$row[1]";
  $rows +=  mysqli_affected_rows($link);
  mysqli_query($link, $sql);
  if($rows == 0) $errors[$row[0]] = $row[1];

if(count($errors) > 0)
  echo '<p>Houston, we have a problem</p><pre>';
  var_export($errors);
  echo '</pre>';

【讨论】:

谢谢!很详细的回答!!我添加了我最终在上面使用的代码。就像你说的那样插入然后更新。

以上是关于WordPress 和 SQL - 如果列值不存在,则从另一个表更新和插入的主要内容,如果未能解决你的问题,请参考以下文章

仅当每个唯一列值不存在时才为每个唯一列值添加一行

SQL中如何实现输出结果某列值不重复?

SSRS如果参数与列值不匹配,如何隐藏Tablix?

如果上一列值不为空,则更新表中的下一列

如果列值不为 NULL,则 Python pandas 应用函数

Oracle SQL:所有行大于值(如果值存在)或所有行小于值(如果值不存在)