2014-06-11 69 views
3

我有2個表:SQL服務器的外鍵約束問題

  1. 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原則。

+0

錯誤是相當清楚的。您試圖將'dogowner'中的'dog_id'指向'dog'中的某個鍵。 'dog'中存在的唯一密鑰是'id,dog_id'上的主組合密鑰。因此,它不能匹配'dog_id'到'dog'表中的任何鍵。 – SchmitzIT

+0

順便說一下,爲什麼你需要/想添加自己的ID列? – SchmitzIT

+0

嗨@SchmitzIT這是爲了版本目的在桌子上。我計劃在更新/刪除操作完成時保留記錄的歷史記錄。我可以在mySQL中輕鬆地做這樣的事情。我想使用dog_id作爲dogowner表中的外鍵。 因此,對於狗表上的軟刪除,記錄將被標記爲非活動(is_active = 0),對於更新,將在狗表上插入新記錄,但dog_id將保持不變。 – QCar

回答

1

的dog_id場必須是唯一的字段,下面的工作:

create table dog(
id int not null identity(1,1), 
dog_id int unique 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) 
); 

從MSFT documentation

您可以使用UNIQUE約束,以確保沒有重複的值 是輸入到不參與主密鑰 的特定列中。雖然UNIQUE約束和PRIMARY KEY約束均強制實施唯一性,但當您要強制實施列的唯一性或不是主鍵的列的組合時,請使用UNIQUE約束,而不要使用PRIMARY KEY 約束。

希望這有助於

+0

嗨@Milica,獨特的鑰匙不會爲我的目的工作。我想維護狗桌上的版本歷史記錄。 dog_id將在狗桌上多次插入。例如。插入狗(dog_id,dog_name,create_date)值(1,'joe',GETUTCDATE());插入狗(dog_id,dog_name,create_date)值(1,'max',GETUTCDATE()); 插入語句意味着名爲'Joe'的狗改爲'Max'。 – QCar

+0

但是,您不能引用dog_id與外鍵,因爲引用的列必須是唯一的。 –

+0

非常感謝您的回答。我已經用我爲解決數據庫版本問題而定下的解決方案更新了我的問題。您的答案確實解決了我從SQL Server收到的錯誤的問題,因此我將其標記爲已解決。 – QCar

0

首先在狗表中的dog_id字段上創建唯一鍵,並在其上創建唯一約束,然後您可以將此唯一鍵作爲外鍵在Dog_owner表中引用。