0

在数据库应用程序中,我想在数据库表中插入、更新和删除记录。表如下: 在此处输入图像描述

在这个表中,Ga1_ID 是主键。假设我当前插入了 5 条记录。在第二次尝试中,如果我想插入 5 个其他记录,并且如果这些新记录中的任何一个包含表中已经存在的主键属性,则会显示错误。没关系。

但是,当我插入新的 5 条记录时......我如何验证这些新记录的主键值不存在。我的意思是,如何匹配或计算已经存在的主键属性,然后插入新记录。

处理这种情况的最佳方法是什么?

4

5 回答 5

1

在数据适配器中使用以下查询:

   da=new SqlDataAdapter("select  Ga1_ID from table where  Ga1_ID=@pkVal",conn);
    DataSet=new DataSet();
    da.fill(ds);

//pass parameter for @pkVal

    da.SelectCommand.Parameters(1).Value = pkValue;    

    if(ds.Tables[0].Rows.Count>0) //If number of rows >0 then record exists
     BEGIN
     messagebox.show("Primary key present");
     END

希望它有帮助。

于 2013-04-13T04:22:28.533 回答
1

不要提前检查现有记录,即不要先选择然后再插入。一种更好(也很常见)的方法是尝试插入并处理异常,特别是如果有主键违规并处理它。

  1. 在 try/catch 块中进行插入,在主键冲突异常和其他 sql 异常类型的情况下使用不同的处理。

  2. 如果没有异常,则工作完成,插入记录。

  3. 如果您发现了主键违规异常,请适当处理(您的帖子没有指定在这种情况下您要做什么,这完全取决于您)

如果您想一次执行 5 次插入并希望确保它们全部成功,或者如果其中任何一个失败则回滚,那么在事务中执行插入。

于 2013-04-13T04:30:10.750 回答
0

您可以在插入之前先进行查找。

IF EXISTS (SELECT * FROM tableName WHERE GA1_id=@newId)
    BEGIN
        UPDATE tableName SET Ga1_docid = @newdocID, GA1_fieldNAme = @newName, Ga1_fieldValue = @newVal where  GA1_id=@newId
    END
ELSE
    BEGIN
        INSERT INTO tableName(GA1_ID, Ga1_docid, GA1_fieldNAme Ga1_fieldValue) VALUES (value1,val2,value3,value4)
    END
于 2013-04-13T04:21:24.323 回答
0

通常,您希望有一个surrogate键,该键通常是identity在您插入行时会自动递增的列,这样您就不必关心知道哪个id已经存在。

但是,如果您必须手动插入,id则有一些替代方法,并且知道您正在使用的 SQL 数据库会有所帮助,但在大多数 SQL 实现中,您应该能够执行以下操作:

如果不存在

IF NOT EXISTS(
        SELECT 1
        FROM your_table
        WHERE Ga1_ID = 1
    )
        INSERT INTO ...

选择不存在的地方

INSERT INTO your_table (col_1, col_2)
SELECT col_1, col_2
FROM (
    SELECT 1 AS col_1, 2 AS col_2
    UNION ALL
    SELECT 3, 4
) q
WHERE NOT EXISTS (
    SELECT 1
    FROM your_table
    WHERE col_1 = q.col_1
)

对于MS SQL Server,您还可以查看该MERGE语句,对于MySQL,您可以使用该INSERT IGNORE语句。

于 2013-04-13T04:26:46.873 回答
0

如果您使用的是 SQL Server 2012,请使用序列对象 - CREATE SEQUENCE。
这样您就可以使用 NEXT VALUE FOR 获得下一个值。

对于较旧的 SQL Server 版本,您需要将主键字段创建为 IDENTITY 字段并使用 SCOPE_IDENTITY 函数获取最后一个标识值,然后手动递增它。

于 2013-04-13T04:29:43.870 回答