在数据库应用程序中,我想在数据库表中插入、更新和删除记录。表如下:
在这个表中,Ga1_ID 是主键。假设我当前插入了 5 条记录。在第二次尝试中,如果我想插入 5 个其他记录,并且如果这些新记录中的任何一个包含表中已经存在的主键属性,则会显示错误。没关系。
但是,当我插入新的 5 条记录时......我如何验证这些新记录的主键值不存在。我的意思是,如何匹配或计算已经存在的主键属性,然后插入新记录。
处理这种情况的最佳方法是什么?
在数据库应用程序中,我想在数据库表中插入、更新和删除记录。表如下:
在这个表中,Ga1_ID 是主键。假设我当前插入了 5 条记录。在第二次尝试中,如果我想插入 5 个其他记录,并且如果这些新记录中的任何一个包含表中已经存在的主键属性,则会显示错误。没关系。
但是,当我插入新的 5 条记录时......我如何验证这些新记录的主键值不存在。我的意思是,如何匹配或计算已经存在的主键属性,然后插入新记录。
处理这种情况的最佳方法是什么?
在数据适配器中使用以下查询:
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
希望它有帮助。
不要提前检查现有记录,即不要先选择然后再插入。一种更好(也很常见)的方法是尝试插入并处理异常,特别是如果有主键违规并处理它。
在 try/catch 块中进行插入,在主键冲突异常和其他 sql 异常类型的情况下使用不同的处理。
如果没有异常,则工作完成,插入记录。
如果您发现了主键违规异常,请适当处理(您的帖子没有指定在这种情况下您要做什么,这完全取决于您)
如果您想一次执行 5 次插入并希望确保它们全部成功,或者如果其中任何一个失败则回滚,那么在事务中执行插入。
您可以在插入之前先进行查找。
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
通常,您希望有一个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
语句。
如果您使用的是 SQL Server 2012,请使用序列对象 - CREATE SEQUENCE。
这样您就可以使用 NEXT VALUE FOR 获得下一个值。
对于较旧的 SQL Server 版本,您需要将主键字段创建为 IDENTITY 字段并使用 SCOPE_IDENTITY 函数获取最后一个标识值,然后手动递增它。