mysql:如果存在则更新插入并在两种情况下都返回id

时间:2012-09-23 11:25:40

标签: mysql sql

我知道这已被问过很多次了,我已经检查了大部分问题,但没有找到适合我问题的答案。

我有一张桌子:

CREATE TABLE `users` (                                   
      `Id` int(11) NOT NULL AUTO_INCREMENT,                  
      `Name` varchar(50) NOT NULL,                           
      `Email` varchar(50) NOT NULL,                                            
      `Added_Date` date DEFAULT NULL,                                             
      PRIMARY KEY (`Id`,`Email`)                             
    )

我将从屏幕中插入此表格中的记录,我会向用户询问他们朋友的NameEmailId

我想要做的只是检查电子邮件ID,如果我的Users表中存在相同的电子邮件ID,则更新输入的name。否则插入新记录。在这两种情况下,我都想要插入或更新记录的userId。

听起来很简单!

但我尝试了ReplaceInsert.. on duplicate key updateinsert where not exists,但没有一个能为我效劳。这是我到目前为止所尝试的:

更换

REPLACE INTO Users SET email = 'a@d.c';

但由于未检查name,因此每次都会继续插入新记录。不确定我是否正确使用它。

INSERT .. ON DUPLICATE KEY UPDATE

insert into Users (id, Name, Email, Added_date) values (null, 'ABCD', 'adb@di.co',current_date) on duplicate key update Name='XYZ';

这不会起作用,因为表的主键是(id和emailid)的组合,并且因为ID是自动增量的,所以每次都会插入一条新记录。

我知道我可以写一个update查询来检查是否有任何特定email_id的记录,如果是,那么它会更新,否则我将insert一条新记录。我可以使用$userId = mysql_insert_id();获取新增加的ID。但是,如果更新查询,我怎样才能获得ID?

我认为除了单独编写更新和插入查询之外,必须有更好的方法来做这件事。

2 个答案:

答案 0 :(得分:2)

主键应仅在Users.Id上设置,对于电子邮件,只需将其设为唯一

CREATE TABLE `users` (                                   
  `Id` int(11) NOT NULL AUTO_INCREMENT,                  
  `Name` varchar(50) NOT NULL,                           
  `Email` varchar(50) NOT NULL,                                            
  `Added_Date` date DEFAULT NULL,                                             
  PRIMARY KEY (Id),
  UNIQUE KEY Email (Email)                            
)

您的查询将是这样的,请注意您可以使用VALUES()函数来检索新值。

Insert into Users (Id, Name, Email, Added_date) 
values (null, 'ABCDe','adb@di.co',current_date) 
on duplicate key update Name=VALUES(Name);

答案 1 :(得分:0)

我没有把你的问题读到最后,但现在我可以说表格架构不正确。主键必须定义为PRIMARY KEY(Id),电子邮件必须定义为Email varchar(50)UNIQUE