SQL Server外键约束问题

时间:2014-06-11 09:46:32

标签: sql sql-server database

我有两张桌子:

  1. dogowner
  2. 我正在尝试从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原则。

2 个答案:

答案 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表中将此唯一键作为外键引用。