我有两张桌子:
我正在尝试从DogOwner创建一个外键到Dog但不在dog表的主键上创建。 我打算为狗桌的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设计,并在每个表上选择了历史表 我想要版本。所以狗表将有一个dog_history或dog_log表,并在所有历史表上完成一个插入/更新。
这不是我想要的方式,但它允许我在数据库中使用外键约束,软删除和数据记录。感谢大家的投入。我遵循KISS原则。
答案 0 :(得分: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 要强制执行列的唯一性时的约束,或 列的组合,这不是主键。
希望这有帮助
答案 1 :(得分:0)
首先在dog表中的dog_id字段上创建唯一键并在其上创建唯一约束,然后您可以在Dog_owner表中将此唯一键作为外键引用。