2017-11-12 22 views
0

申し訳ありませんが、私はここでより具体的に説明しなければなりませんでした。したがって、以下はSQLのコードです。コピーしてSQLに貼り付けます。基本的に、私は一緒にリンクされている13テーブルを作成しています。SQL Serverの外部キーエラー2014

IF EXISTS (SELECT*FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='EventType') 
BEGIN 
    DROP TABLE EventType 
END 
GO 

IF EXISTS (SELECT*FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='EventLocation') 
BEGIN 
    DROP TABLE EventLocation 
END 
GO 

IF EXISTS (SELECT*FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='StudentEvent') 
BEGIN 
    DROP TABLE StudentEvent 
END 
GO 

IF EXISTS (SELECT*FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='Event') 
BEGIN 
    DROP TABLE Event 
END 
GO 

IF EXISTS (SELECT*FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='CurrentAddress') 
BEGIN 
    DROP TABLE CurrentAddress 
END 
GO 

IF EXISTS (SELECT*FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='PreviousAddress') 
BEGIN 
    DROP TABLE PreviousAddress 
END 
GO 

IF EXISTS (SELECT*FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='ContactType') 
BEGIN 
    DROP TABLE ContactType 
END 
GO 

IF EXISTS (SELECT*FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='Contact') 
BEGIN 
    DROP TABLE Contact 
END 
GO 

IF EXISTS (SELECT*FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='StudentMajor') 
BEGIN 
    DROP TABLE StudentMajor 
END 
GO 

IF EXISTS (SELECT*FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='Major') 
BEGIN 
    DROP TABLE Major 
END 
GO 

IF EXISTS (SELECT*FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='Citizenship') 
BEGIN 
    DROP TABLE Citizenship 
END 
GO 

IF EXISTS (SELECT*FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='Country') 
BEGIN 
    DROP TABLE Country 
END 

IF EXISTS (SELECT*FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='Student') 
BEGIN 
    DROP TABLE Student 
END 
GO 

CREATE TABLE Student 
(
    StudentID int identity PRIMARY KEY, 
    FirstName varchar (50), 
    LastName varchar (30) 
) 
GO 

CREATE TABLE Country 
(
    CountryID int identity PRIMARY KEY, 
    CountryOfBirth varchar (10), 
    StudentID int FOREIGN KEY REFERENCES Student(StudentID) 
) 
GO 

CREATE TABLE Citizenship 
(
    CitizenshipID int identity PRIMARY KEY, 
    CountryOfCitizenship1 varchar (10), 
    CountryOfCitizenship2 varchar (10), 
    StudentID int FOREIGN KEY REFERENCES Student(StudentID), 
    CountryID int FOREIGN KEY REFERENCES Country(CountryID) 
) 
GO 

CREATE TABLE Major 
(
    Majorid int identity PRIMARY KEY, 
    MajorName varchar(30), 
    GraduatedMajor varchar (30) 
) 

CREATE TABLE StudentMajor 
(
    StudentMajorid int identity, 
    StudentID int FOREIGN KEY REFERENCES Student(StudentID), 
    MajorID int FOREIGN KEY REFERENCES Major(MajorID) 
) 
GO 

ALTER TABLE StudentMajor 
    ADD constraint uk_sm UNIQUE (StudentID,MajorID) 

CREATE TABLE Contact 
(
    ContactId int identity PRIMARY KEY, 
    StudentID int FOREIGN KEY REFERENCES Student(StudentID), 
    ContactInfo varchar (8), 
    ContactDate datetime 
) 
GO 

CREATE TABLE ContactType 
(
    ContactTypeId int identity PRIMARY KEY, 
    ContactID int FOREIGN KEY REFERENCES Contact(ContactID) 
) 
GO 

CREATE TABLE PreviousAddress 
(
    PreviousAddressId int identity PRIMARY KEY, 
    Address1 varchar (50), 
    Address2 varchar (50), 
    City varchar (20), 
    State varchar (20), 
    Pincode char (10), 
    StudentID int FOREIGN KEY REFERENCES Student(StudentID) 
) 
GO 

CREATE TABLE CurrentAddress 
(
    CurrentAddressId int identity PRIMARY KEY, 
    Address1 varchar (50), 
    Address2 varchar (50), 
    City varchar (20), 
    State varchar (20), 
    Pincode char (10), 
    StudentID int FOREIGN KEY REFERENCES Student(StudentID) 
) 
GO 

CREATE TABLE EventType 
(
    EventTypeID int identity PRIMARY KEY 
) 

CREATE TABLE Event 
(
    EventId int identity PRIMARY KEY, 
    EventDate datetime, 
    EventTitle varchar (50), 
    EventTime datetime, 
    EventTypeID int 
) 
GO 

ALTER TABLE Event 
    ADD constraint fk_Event 
     FOREIGN KEY (EventTypeID) REFERENCES EventType(EventTypeID) 

CREATE TABLE StudentEvent 
(
    StudentEventId int identity PRIMARY KEY, 
    StudentID int FOREIGN KEY REFERENCES Student(StudentID), 
    EventID int FOREIGN KEY REFERENCES Event(EventID), 
    Comment varchar(2000) 
) 
GO 

CREATE TABLE EventLocation 
(
    EventLocationId int identity PRIMARY KEY, 
    EventCountry varchar (50), 
    EventState varchar (50), 
    EventAddress1 varchar (100), 
    EventAddress2 varchar (100), 
    EventCity varchar (50), 
    EventPincode char (10), 
    EventID int FOREIGN KEY REFERENCES Event(EventID) 
) 
GO 

上記のコードの問題は完全にはじめて実行されますが、2回目に実行するとエラーが発生します。

オブジェクト 'EventType'は、FOREIGN KEY制約によって参照されているため、削除できませんでした。

メッセージ2714、レベル16、状態6、行132
データベースには「EventType」という名前のオブジェクトが既に存在します。

メッセージ4902、レベル16、状態1、行143
"Event"オブジェクトが存在しないか、権限がないため、オブジェクト "Event"が見つかりません。

メッセージ1767、レベル16、状態0、行153
外部キー 'FK__EventLoca__Event__6265874F'は無効なテーブル 'イベント'を参照します。 メッセージ1750、レベル16、状態0、行153

制約またはインデックスを作成できませんでした。以前のエラーを参照してください。

外部キーをコードする良い方法がありますか、私は何か間違っていますか?

ありがとうございました!

+2

最初に 'EventType'テーブルを作成してからFKを追加してください – Sami

+0

SQL Serverは、外部キーが参照されている場合にテーブルを削除することを許可しません。テーブルを参照する外部キーがすべて破棄された後*外部キーによって参照されるテーブルが削除されるように、テーブルをドロップする順序を変更するオプションがある場合は1つです。 (別のオプションは、最初に外部キーを削除することです、そして、テーブルは任意の順序で削除することができます。) – spencer7593

+0

私はオプション1を使うつもりですが、SQLでDROPを学ぼうとするのは初めてのことです。あなたが私にDROPステートメントのオーダーを見せて教えてくれればいいと思う。 – biggboss2019

答えて

2

あなたは最初のテーブルを作成する必要があります。

CREATE TABLE Event 
(
    EventId int identity PRIMARY KEY, 
    EventDate datetime, 
    EventTitle varchar (50), 
    EventTime datetime, 
    EventTypeID int 
) 
GO 

CREATE TABLE EventType 
(
    EventTypeID int identity PRIMARY KEY 
); 

ALTER TABLE Event 
    ADD constraint fk_Event 
     FOREIGN KEY (EventTypeID) REFERENCES EventType(EventTypeID); 

またはあなたのテーブルを作成することができますように:

CREATE TABLE EventType 
(
    EventTypeID int identity PRIMARY KEY 
); 

CREATE TABLE Event 
(
    EventId int identity PRIMARY KEY, 
    EventDate datetime, 
    EventTitle varchar (50), 
    EventTime datetime, 
    EventTypeID int, 
    constraint fk_Event FOREIGN KEY (EventTypeID) REFERENCES EventType(EventTypeID) 
); 

更新:

オブジェクトのイベントタイプ 'を削除できませんでした、それ理由FOREIGN KEY制約によって参照されます。メッセージ2714、レベル16、状態6、行132 'EventType'という名前のオブジェクトが既にデータベースにあります。メッセージ4902、レベル16、状態1、行143存在しないか権限がないため、オブジェクト "イベント"が見つかりません。メッセージ1767、レベル16、状態0、行153外部キー 'FK__EventLoca__Event__6265874F'は無効なテーブル 'イベント'を参照します。メッセージ1750、レベル16、状態0、行153制約またはインデックスを作成できませんでした。以前のエラーを参照してください。

このエラーmsgが、あなたは別のテーブルで参照される表をドロップすることはできませんので、あなたが最初Eventテーブルを削除する必要があり、その後、あなたはEventsTypeテーブルをドロップすることができます明らかです。

+0

あなたが発見したように、作成順序は関係ありません。 – SMor

0

Eventの参照として使用する前に、テーブルEventTypeを作成してみてください。