检查记录是否存在然后在数据库 table 中插入新行?

Check if record exists then insert new row in database table?

我正在尝试改进我正在处理的旧代码。目前的代码可以简化,使用SQL来处理插入。这是示例:

<!--- Check if user exists in Table 1 ---> 
<cfquery name="checkUser" datasource="#application.datasource#">
    SELECT user_id 
    FROM table1
    WHERE user_id = '#session.user_id#'
</cfquery>

<cfif !checkUser.recordcount>
    <cfset password = functions.encryptPsw("form.pswd") />
    <cfquery name="getInfo" datasource="#datasource#">
        SELECT fname, lname
        FROM contact
        WHERE userid = #session.user_id#
    </cfquery>

    <cfquery name="insertUser" datasource="#application.database#">
        INSERT INTO inter_work_tbl (
            user_id, 
            first_name, 
            last_name, 
            password
        ) VALUES (
            '#session.user_id#', 
            '#trim(getInfo.fname)#', 
            '#trim(getInfo.lname)#', 
            '#password#'
        )
    </cfquery>
</cfif>

我想知道这是否可以通过 Sybase SQL 并使用 IF NOT EXISTS 然后 运行 插入语句来完成?如果有人有好的例子或建议,请告诉我。谢谢。

我不会 know/work-with coldfusion 所以不确定我是否正确阅读了逻辑...

  • 如果 table1
  • 中不存在记录
  • 记录确实在 contact 然后
  • 退出
  • inter_work_tbl
  • 中插入一行

一般的 T-SQL 查询看起来像(注意:将 T-SQL 与 coldfusion 变量的引用混合):

insert into inter_work_tbl

      (user_id
      ,first_name
      ,last_name
      ,password)

select '#session.user_id#',
       c.fname,
       c.lname,
       '#password#'

from   contact c

where  c.userid = #session.user_id#
and    not exists(select  1
                  from    table1 t
                  where   t.user_id = c.userid)

你的问题是说你想改进你的代码。既然如此,那我们就从这里开始吧。你有:

<cfif !checkUser.recordcount>

这不是真正可读或直观的。这是表达该条件的另一种方式:

<cfif checkUser.recordcount eq 0>

接下来,万一您发布了实际代码,您的 checkUser 查询将查找 table1 中的记录,如果有 none,则将记录放入不同的 table ] - inter_work_tbl。这似乎有点冒险。

接下来,您从一个名为 table 的联系人那里获取信息并将其插入您的 inter_work_tbl table。即使您认为联系人 table 中总会有记录,但如果没有怎么办?由于未定义的变量,您的插入查询将崩溃。另外,为什么需要 table inter_work_tbl 中的名称?您已经有联系人 table。您无缘无故地破坏规范化。

就简化代码以仅使用 sql 而言,@markp 的回答向您展示了如何做到这一点。

抱歉,我没有评论的 50 声望,所以我回复此作为答案。听起来您可以简单地使用 sql merge 语句来完成此操作。

http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc36272.1572/html/commands/commands89.htm