SQL Server外键约束问题
我有两张桌子:SQL Server外键约束问题,sql,sql-server,database,Sql,Sql Server,Database,我有两张桌子: 狗 狗主人 我试图创建一个从DogOwner到Dog的外键,但不是在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
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'.
>更新:
因此,最终我放弃了复杂的模式设计,在每个表上选择了历史表
我想要的版本。因此dog表将有一个dog_历史记录或dog_日志表,并在所有历史记录表上进行后期插入/更新
这不是我想要的方式,但它允许我在数据库中设置外键约束、软删除和记录数据。谢谢大家的意见。我遵循KISS原则。首先在dog表中的dog\u id字段上创建唯一键,并对其创建唯一约束,然后您可以将此唯一键引用为dog\u owner表中的外键。dog\u 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:
可以使用唯一约束来确保没有重复的值
在不参与主列表的特定列中输入
钥匙虽然它是唯一约束和主键约束
强制唯一性,使用唯一约束而不是主键
要强制列的唯一性时的约束,或
列的组合,该组合不是主键
希望这有帮助错误很明显。您正试图将
狗id
从狗主
指向狗
中的一个键。dog
中唯一存在的键是id,dog\u id
上的主组合键。因此,它无法将dog\u id
与dog
表中的任何键相匹配。顺便问一下,您为什么需要/想要添加自己的id列?Hi@SchmitzIT这是为了表上的版本控制目的。我计划在完成任何更新/删除时保留记录的历史记录。我可以在mySQL中轻松地做类似的事情。我想使用dog_id作为dogowner表中的外键。因此,对于dog表上的软删除,记录将被标记为不活动(is_active=0),对于更新,将在dog表上插入一条新记录,但dog_id将保持不变。Hi@Milica,唯一键不适用于我的目的。我想在dog表上维护版本历史记录。同一个dog_id将在dog表上插入多次。例如,在dog(dog_id,dog_name,create_date)中插入值(1,'joe',GETUTCDATE());在dog(dog_id,dog_name,create_date)值(1,'max',GETUTCDATE())中插入;insert语句意味着名为“Joe”的dog已更改为“Max”。但是,您不能使用外键引用dog_id,因为引用的列必须是唯一的。非常感谢您的回答。我已经用我确定的数据库版本控制解决方案更新了我的问题。您的回答确实解决了有关我从SQL Server收到的错误的问题,因此我将其标记为已解决。