我有以下数据库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
,但我不想对其进行检查。
答案 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";