无法使用两个表创建外键

时间:2015-04-11 20:12:40

标签: c# sql-server database

我正在为Linq构建网站,我需要的方法是使用外键来精确地设置与我的用户表相同。

我向我保证我的Tabler有一个主键,因为它必须是使用grab的唯一内容。

这是一个很好的表格

CREATE TABLE [dbo].[brugere] (
    [Id]            INT            IDENTITY (1, 1) NOT NULL,
    [username]    NVARCHAR (255) NOT NULL,
    [password]   NVARCHAR (255) NOT NULL,
    CONSTRAINT [PK_brugere] PRIMARY KEY ([Id]), 
    CONSTRAINT [FK_brugere_ToPoint] FOREIGN KEY ([Id]) REFERENCES [pointantal]([brugerid]), 
    CONSTRAINT [FK_brugere_ToKunde] FOREIGN KEY ([Id]) REFERENCES [KundeData]([brugerid])
);

Poinantal在这里

CREATE TABLE [dbo].[pointantal] (
    [Id]       INT            IDENTITY (1, 1) NOT NULL,
    [point]    INT            NOT NULL,
    [omrade]   NVARCHAR (255) NOT NULL,
    [datotid]  DATETIME       DEFAULT (getdate()) NOT NULL,
    [brugerid] INT            NOT NULL, 
    CONSTRAINT [PK_pointantal] PRIMARY KEY ([Id])
);

和KundeData表格

CREATE TABLE [dbo].[KundeData] (
    [Id]            INT            IDENTITY (1, 1) NOT NULL,
    [Adresse]       NVARCHAR (255) NOT NULL,
    [Postnr]        INT            NOT NULL,
    [Mobil]         INT            NOT NULL,
    [Byen]          NVARCHAR (255) NOT NULL,
    [abonnementsId] INT            NOT NULL,
    [BuyDate]       DATETIME       DEFAULT (getdate()) NOT NULL,
    [prisid]        INT            NOT NULL,
    [HaevedeId]     NVARCHAR (255) NULL,
    [brugerid]      INT            NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);

我尝试更新内容时收到的错误消息在这里

  

由于验证错误,无法继续更新   请更正以下错误,然后重试。

     

SQL71516 ::引用的表'[dbo]。[pointantal]'包含no   与引用列列表匹配的主键或候选键   外键。如果引用的列是计算列,则为   应该坚持下去。 SQL71516 ::引用的表   '[dbo]。[KundeData]'不包含匹配的主键或候选键   外键中的引用列列表。如果引用   column是一个计算列,应该是持久化的。

2 个答案:

答案 0 :(得分:3)

外键只能引用主键或唯一列。您可以向要引用的列添加唯一约束:

CREATE TABLE [dbo].[pointantal] (
    ...
    CONSTRAINT AK_BrugerID UNIQUE(brugerid) 

或者您可以更改约束以实际引用表中的主键:

CONSTRAINT [FK_brugere_ToPoint] FOREIGN KEY ([Id]) REFERENCES [pointantal]([Id])

但是,您似乎真的希望brugeridpointantal表的KundeData列能够访问Id(这是一个唯一的列){ {1}}表。在这种情况下,您将外键放在这些表上,并让它访问brugere表的主键。以下代码在我的系统上成功运行:

bruger

答案 1 :(得分:0)

  

外键是一个表中的字段(或字段集合)   唯一标识另一个表的一行。简单来说,就是   外键在第二个表中定义,但它指的是主键   第一个表中的关键。

尝试:

1>更改参考列

CREATE TABLE [dbo].[pointantal] (
    [Id]       INT            IDENTITY (1, 1) NOT NULL,
    [point]    INT            NOT NULL,
    [omrade]   NVARCHAR (255) NOT NULL,
    [datotid]  DATETIME       DEFAULT (getdate()) NOT NULL,
    [brugerid] INT            NOT NULL, 
    CONSTRAINT [PK_pointantal] PRIMARY KEY ([Id])
);

CREATE TABLE [dbo].[KundeData] (
    [Id]            INT            IDENTITY (1, 1) NOT NULL,
    [Adresse]       NVARCHAR (255) NOT NULL,
    [Postnr]        INT            NOT NULL,
    [Mobil]         INT            NOT NULL,
    [Byen]          NVARCHAR (255) NOT NULL,
    [abonnementsId] INT            NOT NULL,
    [BuyDate]       DATETIME       DEFAULT (getdate()) NOT NULL,
    [prisid]        INT            NOT NULL,
    [HaevedeId]     NVARCHAR (255) NULL,
    [brugerid]      INT            NOT NULL,
    PRIMARY KEY CLUSTERED ([Id])
);

CREATE TABLE [dbo].[brugere] (
    [Id]            INT            IDENTITY (1, 1) NOT NULL,
    [username]    NVARCHAR (255) NOT NULL,
    [password]   NVARCHAR (255) NOT NULL,
    CONSTRAINT [PK_brugere] PRIMARY KEY ([Id]), 
    CONSTRAINT [FK_brugere_ToPoint] FOREIGN KEY ([Id]) REFERENCES [pointantal]([Id]), 
    CONSTRAINT [FK_brugere_ToKunde] FOREIGN KEY ([Id]) REFERENCES [KundeData]([Id])
);

2>更改主键

CREATE TABLE [dbo].[pointantal] (
    [Id]       INT            IDENTITY (1, 1) NOT NULL,
    [point]    INT            NOT NULL,
    [omrade]   NVARCHAR (255) NOT NULL,
    [datotid]  DATETIME       DEFAULT (getdate()) NOT NULL,
    [brugerid] INT            NOT NULL, 
    CONSTRAINT [PK_pointantal] PRIMARY KEY ([brugerid])
);

CREATE TABLE [dbo].[KundeData] (
    [Id]            INT            IDENTITY (1, 1) NOT NULL,
    [Adresse]       NVARCHAR (255) NOT NULL,
    [Postnr]        INT            NOT NULL,
    [Mobil]         INT            NOT NULL,
    [Byen]          NVARCHAR (255) NOT NULL,
    [abonnementsId] INT            NOT NULL,
    [BuyDate]       DATETIME       DEFAULT (getdate()) NOT NULL,
    [prisid]        INT            NOT NULL,
    [HaevedeId]     NVARCHAR (255) NULL,
    [brugerid]      INT            NOT NULL,
    PRIMARY KEY CLUSTERED ([brugerid])
);

CREATE TABLE [dbo].[brugere] (
    [Id]            INT            IDENTITY (1, 1) NOT NULL,
    [username]    NVARCHAR (255) NOT NULL,
    [password]   NVARCHAR (255) NOT NULL,
    CONSTRAINT [PK_brugere] PRIMARY KEY ([Id]), 
    CONSTRAINT [FK_brugere_ToPoint] FOREIGN KEY ([Id]) REFERENCES [pointantal]([brugerid]), 
    CONSTRAINT [FK_brugere_ToKunde] FOREIGN KEY ([Id]) REFERENCES [KundeData]([brugerid])
);