php - MySQL 'insert if not exists'?

  显示原文与译文双语对照的内容

我从google开始,找到了这个文章,它谈到了互斥表。

我有一张有 ~14 记录的表格。 如果我想以相同的格式添加更多的数据,是否有方法确保我想要插入的记录不存在而不使用一对查询( IE,一个查询,一个要插入的查询是空的)?

对字段的unique 约束是否保证 insert 在已经存在时失败?

似乎只是一个约束,当我发出这个插入通过 php,脚本 croaks 。

时间:


INSERT INTO `table` (value1, value2) 
SELECT 'stuff for value1', 'stuff for value2' FROM `table` 
WHERE NOT EXISTS (SELECT * FROM `table` 
 WHERE value1='stuff for value1' AND value2='stuff for value2') 
LIMIT 1 

另外,外 SELECT 声明可以参考 DUAL 为了处理情况下,表最初是空的:


INSERT INTO `table` (value1, value2) 
SELECT 'stuff for value1', 'stuff for value2' FROM DUAL
WHERE NOT EXISTS (SELECT * FROM `table` 
 WHERE value1='stuff for value1' AND value2='stuff for value2') 
LIMIT 1 

下面是一个PHP函数,只有当所有指定的列的值都不在表中时,才会插入一行。

  • 如果其中一个列不同,将添加该行。

  • 如果表格为空,行将添加行。

  • 如果存在指定的列具有指定值的行,则不会添加该行。

    
    function insert_unique($table, $vars)
    {
     if (count($vars)) {
     $table = mysql_real_escape_string($table);
     $vars = array_map('mysql_real_escape_string', $vars);
    
     $req ="INSERT INTO `$table` (`". join('`, `', array_keys($vars))."`)";
     $req. ="SELECT '". join("', '", $vars)."' FROM DUAL";
     $req. ="WHERE NOT EXISTS (SELECT 1 FROM `$table` WHERE";
    
     foreach ($vars AS $col => $val)
     $req. ="`$col`='$val' AND";
    
     $req = substr($req, 0, -5).") LIMIT 1";
    
     $res = mysql_query($req) OR die();
     return mysql_insert_id();
     }
    
     return False;
    }
    
    

使用方法的示例:


<?php
insert_unique('mytable', array(
 'mycolumn1' => 'myvalue1',
 'mycolumn2' => 'myvalue2',
 'mycolumn3' => 'myvalue3'
 )
);
?>


REPLACE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;

如果记录存在,它将被覆盖;如果它还不存在,它将被创建。

请尝试以下操作:


IF (SELECT COUNT(*) FROM beta WHERE name = 'John'> 0)
 UPDATE alfa SET c1=(SELECT id FROM beta WHERE name = 'John')
ELSE
BEGIN
 INSERT INTO beta (name) VALUES ('John')
 INSERT INTO alfa (c1) VALUES (LAST_INSERT_ID())
END

你可以尝试以下示例插入查询。


INSERT INTO TABLE_1 (COL_1,COL_2)
SELECT 'COL1 VALUE', 'COL2 VALUE'
WHERE NOT EXISTS (SELECT * FROM TABLE_1 WHERE COL1='COL1 VALUE');

...