我有2個表:SQL服務器的外鍵約束問題
- 狗
- dogowner
我試圖創建DogOwner到犬的外鍵,但不是主鍵狗桌。 我打算爲狗表的dog_id列創建我自己的唯一ID。 隨函附上模式:
CREATE TABLE dog(
id INT NOT NULL identity(1,1),
dog_id INT NOT NULL,
dog_name VARCHAR (200) NOT NULL,
create_date DATETIME NOT NULL,
update_date DATETIME DEFAULT getutcdate(),
start_date DATETIME DEFAULT getutcdate(),
end_date DATETIME DEFAULT getDate() - 101,
is_active BIT NOT NULL DEFAULT '0',
PRIMARY KEY (id,dog_id)
);
CREATE TABLE dogowner(
dogowner_id INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
dog_id INT NOT NULL,
FOREIGN KEY (dog_id) REFERENCES dog(dog_id)
);
只要我在它失敗,出現以下錯誤dogowner表中創建外鍵約束:
There are no primary or candidate keys in the referenced table 'dog' that match the referencing column list in the foreign key 'FK__dogowner__dog_id__00AA174D'.
>更新:
所以最終我放棄了複雜的Schema設計,並選擇了我想要版本的每個表 上的歷史表。因此,狗表將具有帶有po的dog_history或dog_log表st插入/更新在所有的歷史表上完成。
這不是我想要做到的,但它允許我在數據庫中有外鍵約束,軟刪除和數據記錄。感謝所有的投入。我遵循KISS原則。
錯誤是相當清楚的。您試圖將'dogowner'中的'dog_id'指向'dog'中的某個鍵。 'dog'中存在的唯一密鑰是'id,dog_id'上的主組合密鑰。因此,它不能匹配'dog_id'到'dog'表中的任何鍵。 – SchmitzIT
順便說一下,爲什麼你需要/想添加自己的ID列? – SchmitzIT
嗨@SchmitzIT這是爲了版本目的在桌子上。我計劃在更新/刪除操作完成時保留記錄的歷史記錄。我可以在mySQL中輕鬆地做這樣的事情。我想使用dog_id作爲dogowner表中的外鍵。 因此,對於狗表上的軟刪除,記錄將被標記爲非活動(is_active = 0),對於更新,將在狗表上插入新記錄,但dog_id將保持不變。 – QCar