0

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

我有一张桌子:

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,如果我的用户表中存在相同的电子邮件 ID,然后更新name输入。否则插入一条新记录。在这两种情况下,我都想要已插入或更新的记录的 userId。

听起来很简单!

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

代替

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

但这将继续每次插入新记录,因为name未检查。不确定我是否正确使用它。

插入 .. 重复密钥更新

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?

我相信必须有比分别编写更新和插入查询更好的方法来做这件事。

4

2 回答 2

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);
于 2012-09-23T12:07:27.200 回答
0

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

于 2012-09-23T11:31:38.250 回答