简体   繁体   English

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

[英]WordPress and SQL - Update and Insert from another table if column value doesn't exist

Stuck with some mysql for my wordpress site. 在我的wordpress网站上卡了一些mysql。 All within 1 DB. 全部在1 DB之内。

I am attempting to update wp_options table from wp_2_options (Multisite). 我正在尝试从wp_2_options (多wp_2_options )更新wp_options表。

They both have option_name (unique_key) and option_value columns 它们都具有option_name (unique_key)和option_value

It needs to update the option_value in the wp_options table if the option_name already exists in wp_2_options table 它需要更新option_valuewp_options表如果option_name中已经存在wp_2_options

AND Insert the row from wp_2_options if the option_name doesnt exist. AND如果option_name不存在,则从wp_2_options插入行。

So how do I UPDATE and `INSERT using the UNIQUE KEY value instead of the PRIMARY KEY 那么我该如何使用UNIQUE KEY值而不是PRIMARY KEY进行 UPDATE和`INSERT

How do I do this? 我该怎么做呢?

Structure is the same for both of them 两者的结构相同

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;

Thanks in advance 提前致谢


UPDATE: 更新:

Ended up using this INSERT then UPDATE. 最终使用此INSERT然后使用UPDATE。 This worked for me. 这对我有用。 Will just use this through PHP now. 现在将通过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;

There is nothing you need to do, the indexes will do the work for you. 您无需执行任何操作,索引将为您完成工作。

Just do the INSERT and follow it with an UPDATE. 只需执行INSERT,然后执行UPDATE。

If it exists the INSERT will fail and the UPDATE will do the update. 如果存在,则INSERT将失败,而UPDATE将进行更新。

If it does not exist the INSERT will put it there and the UPDATE will not affect any rows. 如果不存在,则INSERT将其放置在此处,并且UPDATE将不影响任何行。

If I understand it correctly, 如果我理解正确,
Something like this: 像这样:

$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);
}

If you need a warmer fuzzier feeling, use some error detection: 如果需要温暖的模糊感,请使用一些错误检测:

$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>';
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM