現象:在 SSMS 手動 `INSERT` 成功,但 WinForms 程式按鈕新增卻報「主鍵衝突」或「外鍵條件約束失敗」。
資料表之間存在 **主從關係 (FK)**,例如:
CREATE TABLE consumer (
cid INT PRIMARY KEY,
name NVARCHAR(50)
);
CREATE TABLE sale (
sid INT PRIMARY KEY,
cid INT FOREIGN KEY REFERENCES consumer(cid), -- 從表
amount DECIMAL(10,2)
);
向 `sale` 插入資料時,`cid` **必須已存在於 `consumer` 表**,否則拋出 FK 違規 (常被誤判為 PK 衝突)。
using (var conn = new SqlConnection(connStr))
using (var cmd = new SqlCommand(
"INSERT INTO sale (cid, amount) VALUES (@cid, @amt); SELECT SCOPE_IDENTITY();", conn))
{
cmd.Parameters.AddWithValue("@cid", selectedConsumerId); // 必須是已存在的 cid
cmd.Parameters.AddWithValue("@amt", amount);
conn.Open();
int newSid = Convert.ToInt32(cmd.ExecuteScalar());
MessageBox.Show("新增成功,單號: " + newSid);
}
記住:**先有主表資料,才能寫從表資料**;用參數化查詢避免 SQL 注入,並檢查 FK 值來源,即可消除「莫名其妙的主鍵衝突」。