错误与SQL Server表有关

时间:2016-02-24 03:59:06

标签: sql sql-server

我遇到以下问题:当我们运行代码时,它会显示以下错误:

  

参考Ticket表中有主键或候选词   匹配外键中引用列的列表'   FK__Payment__PkTicke__1A14E395

代码:

create table SystemUser
(
    PkUser int identity(1,1),
    UserLogin nvarchar(20) not null unique,
    UserPassword nvarchar(50) not null,
    UserName nvarchar(50) not null,
    UserCpf nvarchar(50) not null,
    UserBirth datetime not null,
    UserGender nvarchar(15) not null,
    AddressCep int not null,
    AddressStreet nvarchar(50) not null,
    AddressNumber nvarchar(20) not null,
    AddressComplement nvarchar(50) not null,
    AddressCity nvarchar(50) not null,
    AddressState nvarchar(50) not null,
    primary key(PkUser)
)

create table Attractions
(
    PkAttraction integer identity(1,1) ,
    AttractionName nvarchar(50) not null unique,
    AttractionDate datetime not null,
    AttractionDescription nvarchar(150) not null
    primary key(PkAttraction)
)

create table Ticket
(
    PkTicket int identity(1,1),
    PkUser int not null,
    PkAttraction int not null,
    TicketPrice decimal not null,
    primary key(PkTicket, PkUser, PkAttraction),
    foreign key(PkUser) references SystemUser(PkUser),
    foreign key(PkAttraction) references Attractions(PkAttraction)
)   

create table Payment
(
    PkPayment int identity(1,1),
    PkTicket int not null,
    Portion int not null,
    IdTransaction nvarchar(100) not null,
    Payday datetime not null,
    primary key(PkPayment, PkTicket),
    foreign key(PkTicket) references Ticket(PkTicket),
)       

create table FormPayment
(
    PkFromPayment int identity(1,1),
    PkPayment int not null,
    ShareValue decimal not null,
    ExpirationDate datetime not null
    primary key(PkFromPayment, PkPayment),
    foreign key(PkPayment) references Payment(PkPayment),
)

2 个答案:

答案 0 :(得分:3)

您的Ticket表作为主键由3列组成:

create table Ticket
(
    .....
    primary key(PkTicket, PkUser, PkAttraction),
    ....
)   

任何想要引用该表的票证还必须为外键提供所有3列

不能仅引用主键的一部分 - 如果你想引用它,你必须它包含的所有列 - 否则你无法建立FK关系

因此,您必须将PkUserPkAttraction列添加到Payment表中,以便建立此FK关系:

create table Payment
(
    PkPayment int identity(1,1),
    PkTicket int not null,
    PkUser int not null,          // add this
    PkAttraction int not null,    // add this
    Portion int not null,
    IdTransaction nvarchar(100) not null,
    Payday datetime not null,
    primary key(PkPayment, PkTicket),

    // change to this
    foreign key(PkTicket, PkUser, PkAttraction) references Ticket(PkTicket, PkUser, PkAttraction)
    .....
)       

答案 1 :(得分:0)

如果未指定FK和PK的名称,SQL Server将生成名称。在这种情况下,看起来像SQL服务器生成重复的名称。 如果为FK和PK指定名称,它将起作用。