Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server外键约束问题_Sql_Sql Server_Database - Fatal编程技术网

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

我有两张桌子:

  • 狗主人
  • 我试图创建一个从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,
        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收到的错误的问题,因此我将其标记为已解决。