如果不存在则插入新行并获取新的或现有的ID

时间:2013-11-24 13:47:56

标签: php mysql insert not-exists last-insert-id

我想通过一个代码使用 NOT EXISTS last_insert_id()来执行以下操作。 下面的代码满足了我的需求,Col1是一个唯一的密钥,代码如果已存在则不会插入数据。如果插入新行或已存在,则代码将返回相关行的$ id

<?php 
mysql_query(" INSERT table SET col1='data1', col2='data2' ");

$result = mysql_query("SELECT id FROM table WHERE col1='data1' ") ;
while($row = mysql_fetch_array( $result )) { $id=$row['id'];}

header("Location:page.php?id=$id"); 
?>

1 个答案:

答案 0 :(得分:0)

让我把我的想法放在这里。我不知道我是否完全理解这个问题。

ON DUPLICATE KEY UPDATE

INSERT INTO table (ID, Col1, Col2)
   VALUES (100, value1, value2)
       ON DUPLICATE KEY UPDATE ID = 100; -- or whatever you need

INSERT INTO table (ID, Col1, Col2)
   VALUES (100, value1, value2)
       ON DUPLICATE KEY UPDATE ID = ID; -- this keeps the ID to what ever it was, no change.

NOT EXISTS

INSERT INTO funds (ID, Col1, Col2)
    SELECT 100, "value1", "value2"
    FROM dual
    WHERE NOT EXISTS (SELECT 1 
          FROM table 
          WHERE ID = 100
    );

“您可以在情境中将DUAL指定为虚拟表名称                                            没有引用表的地方:

其他想法。

替换

这与INSERT完全相同,只有一个重要的例外。如果找到duplicate row,则会先删除它,然后执行INSERT,这样我们就不会收到任何错误消息。

<?php 
   mysql_query(" REPLACE INTO table SET col1='data1', col2='data2' ");

INSERT IGNORE

这是一种抑制duplicate errors的方法,通常是为了防止应用程序崩溃。有时您可能想要尝试插入新行,只是在没有任何投诉的情况下让它失败,以防发现重复。

<?php 
   mysql_query(" INSERT IGNORE INTO table SET col1='data1', col2='data2' ");