Reputation: 563
I have 2 tables :
I am trying to create a foreign key from DogOwner to Dog but not on the Primary Key of the dog table. I am planning to create my own unique id's for the dog table's dog_id column. Herewith the schemas :
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)
);
As soon as I create the foreign key constraint on the dogowner table it fails with the following error :
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'.
> UPDATE :
So eventually I dropped the complicated Schema design and opted for history tables on every table that I want to version.So the dog table will have a dog_history or dog_log table with a post insert/update done on all the history tables.
This is not the way I wanted to do it but it allows me to have foreign key constraints in my database, soft deletes and logging of data. Thanks all for the input. I am following the KISS principle.
Upvotes: 3
Views: 217
Reputation: 3780
The dog_id field needs to be unique field, the following will work:
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)
);
From the MSFT documentation:
You can use UNIQUE constraints to make sure that no duplicate values are entered in specific columns that do not participate in a primary key. Although both a UNIQUE constraint and a PRIMARY KEY constraint enforce uniqueness, use a UNIQUE constraint instead of a PRIMARY KEY constraint when you want to enforce the uniqueness of a column, or combination of columns, that is not the primary key.
Hope this helps
Upvotes: 1
Reputation: 101
First create unique key on dog_id field in dog table and create unique constraint on it and then you can refer this unique key as foreign key in Dog_owner table.
Upvotes: 0