2010-05-13 80 views
0

我試圖替換某個表中給定日期的所有記錄。該表具有由7個字段組成的複合主鍵。一個這樣的領域是日期。SQL Server複合主鍵

我已刪除日期值爲2/8/2010的所有記錄。當我嘗試將記錄插入到2010年8月2日的表中時,我得到了主鍵違規。我試圖插入的記錄僅適用於2010年2月8日。

由於日期是PK的一個組成部分,只要我插入的日期不在表中,就不應該有違反約束的方法嗎?

在此先感謝。

回答

2

您可能在要插入的數據中有重複項。

此外,擁有由7個字段組成的主鍵是非常非常非常差的做法。處理這個問題的正確方法是在七個字段上有一個替代身份密鑰和唯一索引。加入7個表格的子表是保證表現不佳並更新記錄,當他們將子記錄變成惡夢時,可以完全鎖定系統。主鍵應該是唯一的,不應該改變。

+0

謝謝。我意識到桌子設計中的缺陷,但不幸的是,我不能改變它,只是爲了讓它工作。 – Colin 2010-05-13 17:20:55

+0

另外,你是對的!我必須將雙重記錄加載到另一張沒有PK的表格中。再次感謝。 – Colin 2010-05-13 17:35:25

+1

大聲笑,如果我一兩次沒有自己做過,你覺得我如此快地知道答案。 – HLGEM 2010-05-13 18:04:29

2

是否所有行在該字段中只有日期組件(即時間始終設置爲午夜:00:00:00)?如果不是,則需要刪除> = 2010年2月8日和2010年2月9日的行。

此外,你確定你不是不小心試圖插入兩個記錄與相同的日期(和在其他6個PK領域相同的值)?

0

也許有什麼事在這裏你不知道。當你插入一行並得到一個主鍵違例時,試着用無法插入的行的適當鍵值(當然是在做一次ROLLBACK之後)嘗試做一個SELECT並且看看你得到了什麼。或者,也許在表格中有一個觸發器,您要插入的數據將行插入到使用相同主鍵但未清除的另一個表中。

你可以嘗試下面的SELECT看到什麼變成了:

SELECT * FROM YOUR_TABLE 其中date> 2010年2月7日和 日期< 2010/2/9;

(不確定在SQL Server中的日期常量的正確格式,因爲我在幾年內沒有使用它,但我相信你會明白)。看看你得到了什麼。

祝你好運。