簡體   English   中英

在沒有主鍵的情況下插入或更新(如果存在)

[英]Insert or update (if exists) without primary key

我有以下數據庫 MySQL 表。

  • id(PK,AI)
  • 電子郵件
  • 國家
  • 上次登錄

我在 PHP 中有一個常規查詢,可將其插入表中。 但是,從邏輯上講,如果此代碼運行多次,則每次都會將同一行插入到數據庫中。

我希望我的檢查和復制參考是email字段,如果電子郵件相同,則更新countrylastlogin

我檢查了類似問題的其他問題,建議的方法是像這樣使用ON DUPLICATE KEY

INSERT INTO <table> (field1, field2, field3, ...) 
VALUES ('value1', 'value2','value3', ...)
ON DUPLICATE KEY UPDATE
field1='value1', field2='value2', field3='value3', ...

但是,我的主鍵不是email字段而是id但我不想對其進行檢查。

一種選擇是使email字段唯一,然后它的行為應該與主鍵相同,至少對於 MySQL 的ON DUPLICATE KEY UPDATE

ALTER TABLE yourTable ADD UNIQUE INDEX `idx_email` (`email`);

進而:

INSERT INTO yourTable (email, country, lastlogin)
VALUES ('tony9099@stackoverflow.com', 'value2', 'value3')
ON DUPLICATE KEY UPDATE
    email='value1', country='value2', lastlogin='value3'

如果電子郵件tony9099@stackoverflow.com已存在於您的表中,則更新將使用替代值啟動。

從 MySQL 文檔

如果您指定 ON DUPLICATE KEY UPDATE,並且插入的行會導致 UNIQUE 索引或 PRIMARY KEY 中的重復值,則 MySQL 執行舊行的 UPDATE。

這種方法不僅適用於主鍵,還適用於任何具有唯一索引的列。

正如 Dan 所提到的,ROW_COUNT() 內置函數在標准配置下不支持此解決方案。

MySQL::ROW_COUNT()

對於 UPDATE 語句,默認情況下受影響的行值是實際更改的行數。 如果在連接到 mysqld 時為 mysql_real_connect() 指定CLIENT_FOUND_ROWS標志,則受影響的行值是“找到”的行數; 也就是說,由 WHERE 子句匹配。

如果修改數據庫架構不是一個選項,您可以使用以下方法:

UPDATE `table` SET `country`='value1', `lastlogin`='value1' WHERE `email`='value3'

IF ROW_COUNT()=0
    INSERT INTO `table` (`email`, `country`, `lastlogin`) VALUES ('value1', 'value2', 'value3')

您可以使用

$query=mysql_query("select * from table where email = 'your email'");
if(mysql_num_rows($query) > 0){
//update
}else{
//insert
}

您可以先使用給定的電子郵件加載一行,然后根據加載的行的存在決定是否必須插入或更新。 這需要多個 SQL 語句,但可以以獨立於 DBMS 供應商的方式編寫。 使用周圍事務來處理並發。 電子郵件列上的索引對於保持存在很有用 - 快速檢查。 在電子郵件列上添加唯一 - 約束是一個選項,以保證永遠不會有多個行具有相同的電子郵件。

您可以像在將值插入表之前一樣手動執行此操作,首先檢查表中是否存在該值,如果是,則更新您的相關字段

    $qry = mysql_query("select * from table where email='abc@abc.com'");
    $count = mysql_num_rows($qry);
    if($count > 0){
       write your update query here
   }else{
       write your insert query here
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM