【问题标题】:How do I prevent duplicate entries in a database when inserting new entries with SQL?使用 SQL 插入新条目时,如何防止数据库中出现重复条目​​?
【发布时间】:2020-02-26 06:31:40
【问题描述】:

我正在编写一个程序,我需要使用 SQL 将数据插入数据库。但是我意识到我需要使用验证来确保相同的 x.name 不会两次输入到数据库中。 (FormBoxes 是一个对象列表)代码需要从数据库中读取,而不是添加已经在 ID 列中的数据

【问题讨论】:

    标签: sql vb.net ms-access


    【解决方案1】:

    我倾向于认为您希望始终避免在此列中出现重复,而不仅仅是针对这段特定的代码。如果是这样,我建议在该列上简单地创建一个唯一约束:

    ALTER TABLE tblDate ADD CONSTRAINT ID_UNIQUE_CONSTRAINT UNIQUE (ID);
    

    然后您的 RDBMS 将强制执行数据完整性(这是他们做得很好的事情)。如果您尝试插入重复项,您将收到一个特定错误,您可以在应用程序中捕获并处理该错误(在您的用例中,可能会忽略它)。

    【讨论】:

    • 对不起,如果我有点笨,但是我将如何实现呢?
    • @Bill435:实际上你只需要在我的回答中针对你的数据库执行 sql 命令。
    【解决方案2】:

    请尝试这个,但建议您更改带有要索引的 ID 的表:

    insert into tblDate  (ID)
    SELECT drvd1.tID FROM   (
    select @ID as tID) as drvd1 left join tblDate  on ID=drvd1.tID
    where tblDate.ID is NULL;
    

    如果您的数据库不是 SQL Server,则无法使用以上,对于 MS Access,我已经创建了另一个

    【讨论】:

      【解决方案3】:

      对于 ms Access,您可以使用注释来执行此操作,至少您的 tblDate 中有 1 条记录:

      insert into tblDate (ID)
      SELECT myAlias.tID
      FROM (SELECT top 1 @ID AS tID
                   FROM tblDate
            union all
            SELECT tblDate.ID
                   FROM tblDate
                   WHERE (((tblDate.ID)=@ID)))  AS myAlias
      GROUP BY myAlias.tID
      HAVING (((Count(myAlias.tID))=1));
      

      【讨论】:

        【解决方案4】:

        您忘记了 Access 不注意命名参数。重要的是参数添加到参数集合的顺序。他们只是“?”要访问,所以我们需要 2 个参数都分配了相同的值。

        Using...End Using 块将关闭并释放您的数据库对象。

        不要使用.AddWithValue。见http://www.dbdelta.com/addwithvalue-is-evil/ 和 https://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/ 还有一个: https://dba.stackexchange.com/questions/195937/addwithvalue-performance-and-plan-cache-implications 这是另一个 https://andrevdm.blogspot.com/2010/12/parameterised-queriesdont-use.html

        只在 For 循环之外创建一个命令,并且只填充一个参数集合。在循环内部只需更改参数的值。

        Private Sub UpdateAccess()
            Using cn As New OleDbConnection("Your connection string"),
                    cmd As New OleDbCommand("INSERT INTO tblDate (ID) VALUES (@ID) WHERE Not EXISTS(Select * FROM tblDate WHERE ID = @ID2)", cn)
                cmd.Parameters.Add("@ID", OleDbType.Integer)
                cmd.Parameters.Add("@ID2", OleDbType.Integer)
                cn.Open()
                For Each X In FormBoxes
                    cmd.Parameters("@ID").Value = X.Name
                    cmd.Parameters("@ID2").Value = X.Name
                Next
            End Using
        End Sub
        

        【讨论】:

        • 这不起作用,但也许我没有正确实现它@Mary
        • @Bill435 你收到错误了吗? “没有工作”的信息量不是很大。究竟是什么不起作用?
        • 抱歉,我收到的错误信息是'Missing ), ], or Item in query expression 'Not EXISTS(Select * FROM tblDate WHERE ID = @ID2
        • @Bill435 在结束引号" 之前的@ID2 之后是否有右括号) ? ...= @ID2)"
        • 是的,我确实有一个右括号
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-25
        • 1970-01-01
        • 2015-04-06
        • 1970-01-01
        • 1970-01-01
        • 2017-08-14
        • 1970-01-01
        相关资源
        最近更新 更多