外键错误SQL Server

时间:2014-11-10 16:52:50

标签: sql-server

我有三个要使用外键连接的表。

CREATE TABLE customer
(
    customerID INT,
    lastname VARCHAR(70) NOT NULL,
    firstname VARCHAR(70) NOT NULL,
    phone VARCHAR(10) CONSTRAINT phoneCheck CHECK ((phone LIKE '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]')),
    category VARCHAR(1) NOT NULL CONSTRAINT categoryDefault DEFAULT 'A',
    CONSTRAINT categoryCheck CHECK (category IN ('A', 'B', 'C')),

    CONSTRAINT customerPK
        PRIMARY KEY (customerID)
)


CREATE TABLE booking
(
    customerID INT,
    packageCode VARCHAR(6) UNIQUE,
    bookingDate DATE NOT NULL DEFAULT GETDATE(),
    amountPaid MONEY CONSTRAINT amountPaidDefault DEFAULT 0.00,

    CONSTRAINT bookingPK
        PRIMARY KEY (customerID),

    CONSTRAINT bookingFK
        FOREIGN KEY (customerID)
        REFERENCES customer (customerID)
        ON DELETE CASCADE
);

CREATE TABLE package
(
    packageCode VARCHAR(6),
    destination VARCHAR(70),
    CONSTRAINT packageCodeCheck CHECK (packageCode LIKE ('YFK%')),
    price MONEY NOT NULL CONSTRAINT priceCheck CHECK ((price BETWEEN 1000 AND 10000)),
    passportRequired VARCHAR(1) NOT NULL CONSTRAINT passportRequiredDefault DEFAULT 'Y',
    CONSTRAINT passportCheck CHECK (passportRequired IN ('Y', 'N')),

    CONSTRAINT packagePK
        PRIMARY KEY (packageCode),

    CONSTRAINT packageFK
        FOREIGN KEY (packageCode)
        REFERENCES booking (packageCode)
        ON DELETE CASCADE
)

我在客户和预订之间设置了正确的外键,其目的是删除与该客户的所有相关预订。我目前正在尝试在包和预订之间做同样的事情,当删除包记录时,它也应该删除相应的记录。我继续得到错误

  

INSERT语句与FOREIGN KEY约束冲突   “packageFK”。冲突发生在数据库“travel”,表中   “dbo.booking”,列'packageCode'。

我不太确定这是什么引用,因为我之前遇到过这个错误并修复它,不幸的是......在这种情况下我不能。

非常感谢所有帮助。

谢谢, 布赖恩

2 个答案:

答案 0 :(得分:2)

由于您要在删除包时删除所有预订行,因此包表必须是主表,并且预订表必须引用包表。从表中删除外键约束并将以下内容添加到预订表中:

CONSTRAINT booking_packageFK
    FOREIGN KEY (packageCode)
    REFERENCES package (packageCode)
    ON DELETE CASCADE 

您还应该从预订表上的packageCode中删除UNIQUE约束。

答案 1 :(得分:1)

即使在客户和预订之间,我也不认为您的外键关系设置正确。 在您的Create Table customer后面告诉服务器CustomerId是客户表中的主键:

CONSTRAINT customerPK
        PRIMARY KEY (customerID)

在您的Create Table booking后面告诉服务器CustomerId是主键以及引用客户的外键:

 CONSTRAINT bookingPK
        PRIMARY KEY (customerID),

    CONSTRAINT bookingFK
        FOREIGN KEY (customerID)
        REFERENCES customer (customerID)
        ON DELETE CASCADE

同样在您的包表中,您已将packageCode设置为主键和外键。

我认为你需要的是:

  1. CustomerId表中的Customer应该是主键

  2. BookingId表格中应该有CustomerIdBookingBookingId将成为主键,CustomerId将成为引用Customer的外键。

  3. BookingId表格中应该有Package。它将是引用Booking

  4. 的外键