【问题标题】:Insert record if email id and username not exist如果电子邮件 ID 和用户名不存在则插入记录
【发布时间】:2011-11-03 14:53:20
【问题描述】:

我已经写了这个插入查询:

INSERT INTO tblUsers(FirstName, LastName, UserName, Password
                     , EmailId, Created_Date, typeid) 
VALUES ('" + ObjUserProp.FirstName + "','" + ObjUserProp.LastName + "'
       ,'" + ObjUserProp.UserName + "','" + ObjUserProp.Password + "'
       ,'" + ObjUserProp.EmailId + "','" + ObjUserProp.Created_Date + "'
       ," + ObjUserProp.TypeId + ")

我需要检查用户名和电子邮件是否存在。如果不存在则仅插入记录,否则返回 false

【问题讨论】:

  • 亲爱的投票者,如果您必须投票,请至少说明原因。问题很清楚,数据库设计是可疑的(存储未加密的密码,不加盐)。之前已经问过几次(很可能),但在那种情况下,用 dup 链接投了一个密切的投票。

标签: c# mysql


【解决方案1】:

两个查询有什么问题?首先,使用 select count(id) from users where username=<username> and/or email=<email> 之类的东西,如果计数为 0,则进行插入。

【讨论】:

  • 这有什么问题是您要对数据库服务器执行两次 ping 操作,以便在一次查询中轻松完成。
  • “轻松”定义。对于快速阅读者来说,您的 SQL 墙是做什么的绝对不清楚,而两个简单的查询(一个选择和一个插入)则无法再清楚了。此外,您很可能不想在一个查询中处理此问题,因为当select count 返回 1 时,您可能希望显示某种错误消息。是的,这可以通过在执行查询后请求受影响的行数来实现,但这对我来说更像是一种解决方法,而不是一个额外的查询。
  • 取决于您正在执行的插入次数。而且我不会在不需要的情况下对数据库进行 ping 操作。 ESP 如果客户端和服务器不在一台机器上。
【解决方案2】:

虽然 Microsoft SQL Server 为 SQL 语句提供了 IF NOT EXIST 选项,但如果您使用的是 MYSQL,我建议您使用 INSERT ... ON DUPLICATE KEY UPDATE 语法。

这可以在您的示例中通过执行以下操作来完成:

INSERT INTO tblUsers(FirstName, LastName, UserName, Password
                 , EmailId, Created_Date, typeid) 
VALUES ('" + ObjUserProp.FirstName + "','" + ObjUserProp.LastName + "'
   ,'" + ObjUserProp.UserName + "','" + ObjUserProp.Password + "'
   ,'" + ObjUserProp.EmailId + "','" + ObjUserProp.Created_Date + "'
   ," + ObjUserProp.TypeId + ") ON DUPLICATE KEY UPDATE id=id

您需要确保将 emailId 和 UserName 设置为表中的 KEY。

【讨论】:

    【解决方案3】:
    INSERT INTO tblUsers(FirstName, LastName, UserName, Password 
                         , EmailId, Created_Date, typeid)  
    SELECT ObjUserProp.FirstName    as Firstname,    <<-- note the keyword SELECT
          ObjUserProp.LastName      as lastname,
          ObjUserProp.UserName      as username,
          ObjUserProp.Password      as password,
          ObjUserProp.EmailId       as emailid,
          ObjUserProp.Created_Date  as created_date,
          ObjUserProp.TypeId        as typeid
    FROM DUAL 
    WHERE NOT EXISTS (
      SELECT 1 FROM tbluser u 
      WHERE u.username = ObjUserProp.UserName 
        AND u.Emailid = ObjUserProp.EmailId) 
    LIMIT 1 
    

    您必须将引号和+ 放回查询中,但这是一般的想法。

    【讨论】:

    • 如果用户不存在,则不会插入任何内容。
    • @CodeCaster 这正是 OP 所要求的,也正是我想要的代码。
    • 请原谅我的法语,但 “如果不存在则仅插入记录” 与此完全相反吗?
    • 我写了这个: INSERT INTO tblUsers(FirstName, LastName, UserName, Password, EmailId, Created_Date, typeid) VALUES ('" + ObjUserProp.FirstName + "','" + ObjUserProp.LastName + "','" + ObjUserProp.UserName + "','" + ObjUserProp.Password + "','" + ObjUserProp.EmailId + "','" + ObjUserProp.Created_Date + "'," + ObjUserProp.TypeId + " ) WHERE NOT EXIST(SELECT * FROM tblUsers WHERE UserName='" + ObjUserProp.UserName + "' AND EmailId='" + ObjUserProp.EmailId + "') 请告诉我它有什么问题
    • @user985225 阅读我的回答,阅读您的评论,查看差异,然后问问自己这些差异的性质。
    猜你喜欢
    • 2011-08-09
    • 1970-01-01
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2014-04-04
    相关资源
    最近更新 更多