我知道这已被问过很多次了,我已经检查了大部分问题,但没有找到适合我问题的答案。
我有一张桌子:
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`)
)
我将从屏幕中插入此表格中的记录,我会向用户询问他们朋友的Name
和EmailId
。
我想要做的只是检查电子邮件ID,如果我的Users表中存在相同的电子邮件ID,则更新输入的name
。否则插入新记录。在这两种情况下,我都想要插入或更新记录的userId。
听起来很简单!
但我尝试了Replace
,Insert.. on duplicate key update
,insert 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?
我认为除了单独编写更新和插入查询之外,必须有更好的方法来做这件事。
答案 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