[英]Insert or update (if exists) without primary key
我有以下數據庫 MySQL 表。
我在 PHP 中有一個常規查詢,可將其插入表中。 但是,從邏輯上講,如果此代碼運行多次,則每次都會將同一行插入到數據庫中。
我希望我的檢查和復制參考是email
字段,如果電子郵件相同,則更新country
和lastlogin
。
我檢查了類似問題的其他問題,建議的方法是像這樣使用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() 內置函數在標准配置下不支持此解決方案。
對於 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.