php – 插入或更新(如果存在)没有主键

我有以下数据库MySQL表.

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

我在PHP中有一个常规查询,将其插入表中.
但是,从逻辑上讲,如果此代码运行多次,则每次都会向数据库插入相同的行.

我希望我的检查和复制参考是电子邮件字段,如果电子邮件是相同的,请更新国家和lastlogin.

我检查了类似问题的其他问题,建议的方法是使用ON DUPLICATE KEY这样

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

但是,我的主键不是电子邮件字段而是id,但我不想对其进行检查.

解决方法:

一个选项是使电子邮件字段唯一,然后它应该与主键相同,至少关于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

If you specify ON DUPLICATE KEY UPDATE, and a row is inserted that would cause a duplicate value in a UNIQUE index or PRIMARY KEY, MysqL performs an UPDATE of the old row.

方法不仅适用于主键,还适用于具有唯一索引的任何列.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...