仅插入第一个表中不存在于第二个表中的数据

时间:2015-07-09 19:39:10

标签: php mysql sql mysqli

我试图弄清楚如何将数据从第一个表插入到第二个表中,但我不想插入第二个表已经从之前的注入中获得的现有数据。在插入数据之前还有检查吗?

以下是我目前的情况:

//Get Connection
require_once('connect.php');

//Copy data to another table
$query = mysqli_query($con, "INSERT INTO content2 (d1, d2, d3) SELECT d1, d2, d3 FROM content");

mysqli_close($con);

我试图把#34; LIMIT 1"进入查询,但它没有工作。我不确定我是否把它放在正确的地方......

3 个答案:

答案 0 :(得分:2)

您可以让数据库验证数据是否唯一。例如,如果d1, d2, d3的三元组应该是唯一的,那么在这些列上创建一个唯一的索引/约束:

create unique index idx_content2_d1_d2_d3 on content2(d1, d2, d3);

然后,如果您尝试插入一行,您将收到错误。您可以使用on duplicate key update

解决此错误
INSERT INTO content2(d1, d2, d3)
    SELECT d1, d2, d3
    FROM content
    ON DUPLICATE KEY UPDATE d1 = values(d1);

更新实际上并未更改任何值。它只是防止发生错误。

答案 1 :(得分:1)

INSERT INTO content2 (d1,d2,d3)
SELECT c1.d1,c1.d2,c1.d3 from content c1
Where   not exists (
       select *
       from content2 as c2
       where c1.d1 = c2.d1 and c1.d2 = c2.d2 and c1.d3 = c2.d3
   )

希望这会有所帮助

Fiddle for selecting the row from c1 which not exist in c2

在插入之前,你要检查整行是否包含为什么条件是针对d1,d2,d3。如果只需要检查任何列,你可以避免其他人

答案 2 :(得分:1)

作为Gordon Linoff回答的补充,还可以使用INSERT IGNORE生成错误消息,从而实现此结果。

您的查询将如下所示:

$query = mysqli_query($con, "INSERT IGNORE INTO content2 (d1, d2, d3) SELECT d1, d2, d3 FROM content");

如果您尝试插入content2的数据包含表中已存在的主键,则会跳过该数据。这将生成警告,而不是生成错误消息。如果记录中尚不存在该记录,则将创建该记录。