将条目从一个MySQL表复制到另一个不存在的MySQL表


Copy entries from one MySQL table to another if it does not exist

如果条目不存在,我将尝试将条目从一个表复制到另一个表。下面的代码没有任何条目。我似乎无法确定。我在这里错过了什么?

<?php
$conn = mysqli_connect("localhost", "user", "Pass123", "DB");
$copy="SELECT * FROM TIME";
$doit=$conn->query($copy);
while($row = $doit->fetch_assoc()){
  $check=mysqli_query($conn, "SELECT * FROM TIME2 WHERE O_LOG='{$row['LOG']}'");
  if(!$check){
    $sql = mysqli_query($conn, "INSERT INTO TIME2 (O_LOG, T_IN, T_OUT, EMP, ITEM, NOTE) VALUES ('".$row['LOG']."', '".$row['T_IN']."', '".$row['T_OUT']."', '".$row['EMP']."', '".$row['ITEM']."', '".$row['NOTE']."')");
  }
}
?>
if (!$check)

应该是

if ($check->num_rows == 0)

您只是在测试查询是否出错,而不是它是否没有返回行。

但相反,您可以通过一个查询完成所有操作:

INSERT IGNORE INTO TIME2 (O_LOG, T_IN, T_OUT, EMP, ITEM, NOTE)
SELECT LOG, T_IN, T_OUT, EMP, ITEM, NOTE
FROM TIME

IGNORE修饰符告诉它静默地跳过任何可能导致重复密钥错误的插入(我假设LOG是唯一密钥(。

如果LOG不是唯一的密钥,您仍然可以使用一个查询:

INSERT INTO TIME2 (O_LOG, T_IN, T_OUT, EMP, ITEM, NOTE)
SELECT t.LOG, t.T_IN, t.T_OUT, t.EMP, t.ITEM, t.NOTE
FROM TIME AS t
LEFT JOIN TIME2 AS t2 ON t.LOG = t2.O_LOG
WHERE t2.O_LOG IS NULL

您可以尝试下面的SQL语句,它将自动比较并插入任何丢失的条目到克隆表:

INSERT INTO `TIME2`
SELECT * FROM `TIME` o
WHERE (
  SELECT COUNT(*) FROM `TIME2` c WHERE c.`O_LOG` = o.`LOG`
) = 0
INSERT INTO TIME2 (select * from TIME where LOG not in(select O_LOG from TIME2 ))

INSERT INTO TIME2 (O_LOG, T_IN, T_OUT, EMP, ITEM, NOTE) (select LOG, T_IN, T_OUT, EMP, ITEM, NOTE  from TIME where LOG not in(select O_LOG from TIME2 ))