1. ホーム
  2. sql-server

[解決済み】PRIMARY KEY制約に違反しました。オブジェクトに重複したキーを挿入できない

2022-02-20 16:57:51

質問内容

プロジェクトを継承したのですが、SQLエラーが発生し、修正する方法がわかりません。

eCommerce サイトで、コードは注文の配送情報を別のデータベース・テーブルに挿入しています。

以下は、テーブルに情報を挿入しているコードです。

string sql = "INSERT INTO AC_Shipping_Addresses   
(pk_OrderID, FullName, Company, Address1, Address2, City, Province, PostalCode, CountryCode, Phone, Email, ShipMethod, Charge_Freight, Charge_Subtotal)  
VALUES (" + _Order.OrderNumber;
sql += ", '" + _Order.Shipments[0].ShipToFullName.Replace("'", "''") + "'";
if (_Order.Shipments[0].ShipToCompany == "")
{
  sql += ", '" + _Order.Shipments[0].ShipToFullName.Replace("'", "''") + "'";
}
else
{
  sql += ", '" + _Order.Shipments[0].ShipToCompany.Replace("'", "''") + "'";
}
sql += ", '" + _Order.Shipments[0].Address.Address1.Replace("'", "''") + "'";
sql += ", '" + _Order.Shipments[0].Address.Address2.Replace("'", "''") + "'";
sql += ", '" + _Order.Shipments[0].Address.City.Replace("'", "''") + "'";
sql += ", '" + _Order.Shipments[0].Address.Province.Replace("'", "''") + "'";
sql += ", '" + _Order.Shipments[0].Address.PostalCode.Replace("'", "''") + "'";
sql += ", '" + _Order.Shipments[0].Address.Country.Name.Replace("'", "''") + "'";
sql += ", '" + _Order.Shipments[0].Address.Phone.Replace("'", "''") + "'";
if (_Order.Shipments[0].ShipToEmail == "")
{
  sql += ",'" + _Order.BillToEmail.Replace("'", "''") + "'";
}
else
{
  sql += ",'" + _Order.Shipments[0].ShipToEmail.Replace("'", "''") + "'";
}
sql += ", '" + _Order.Shipments[0].ShipMethod.Name.Replace("'", "''") + "'";
sql += ", " + shippingAmount;
sql += ", " + _Order.ProductSubtotal.ToString() + ")";
bll.dbUpdate(sql);

正常に動作していますが、以下のようなSQLエラーも出力されます。

PRIMARY KEY 制約 'PK_AC_Shipping_Addresses' に違反しました。挿入できません。 オブジェクト 'dbo.AC_Shipping_Addresses' に重複したキーがあります。重複するキーの値 は (165863) です。

似たような質問を読むと、ステートメントでIDを宣言したほうがいいようです。

これは正しいのでしょうか?この問題を解決するには、どのようにコードを調整すればよいでしょうか?

解決方法は?

pk_OrderID は AC_Shipping_Addresses の PK であることは確かです。

そして、あなたは_Order.OrderNumberを介して重複を挿入しようとしています。

を行う。

select * from AC_Shipping_Addresses where pk_OrderID = 165863;

または select count(*) ....

確実に1行が返されます。

これは、pk_OrderID = 165863 をすでに使用しており、その値を持つ別の行を持つことができないことを意味しています。

行がある場合は挿入しないようにしたい場合

insert into table (pk, value) 
select 11 as pk, 'val' as value 
where not exists (select 1 from table where pk = 11)