不带主键插入或更新(如果存在)

时间:2017-03-10 07:25:30

标签: php mysql

我有以下数据库MySQL表。

  • id(PK,AI)
  • 电子邮件
  • 国家
  • lastlogin

我在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,但我不想对其进行检查。

5 个答案:

答案 0 :(得分:5)

一个选项是使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 documentation

  

如果指定ON DUPLICATE KEY UPDATE,并且插入的行会导致UNIQUE索引或PRIMARY KEY中出现重复值,则MySQL会执行旧行的UPDATE。

这种方法不仅适用于主键,它也适用于任何具有唯一索引的列。

答案 1 :(得分:2)

如果不能修改数据库模式,可以使用以下方法:

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

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

答案 2 :(得分:0)

你可以使用

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

答案 3 :(得分:0)

您可以先使用给定的电子邮件加载一行,然后根据已加载的行的存在来决定是否必须插入或更新。这需要多个SQL语句,但它可以以独立于DBMS供应商的方式编写。使用周围的事务来处理并发。电子邮件列上的索引对于保持存在很有用 - 快速检查。在email-column上添加唯一约束是一种选项,可以保证永远不会有多行具有相同的电子邮件。

答案 4 :(得分:0)

您可以手动执行此操作,例如在将值插入表之前首先检查表中是否存在值,如果是,则更新您的相关字段

-- SET @@SESSION.sql_mode = 'ANSI_QUOTES';
SET @@SESSION.sql_mode = '';
USE mysql;
FLUSH PRIVILEGES;
CREATE USER "root"@"%" IDENTIFIED BY "1234567890abcdef";