2017-08-12 64 views
0

我是SQL和SQL Server的新手。我正在嘗試實施一個小型數據庫。但是,我不斷收到三個錯誤。我不斷收到SQL Server上的錯誤 - 字符串和二進制數據截斷,外鍵約束

錯誤#1:

字符串或二進制數據將被截斷

錯誤#2:

INSERT語句衝突與外鍵約束 「FK__Formation__Locat__25869641」

錯誤#3:

INSERT語句與FOREIGN KEY約束「FK__DATA__Classifica__2B3F6F97」衝突。

我試過了各種不同的改變,似乎沒有任何工作。有人可以向我解釋我做錯了什麼嗎?由於

CREATE TABLE Location 
(
    LocationID CHAR(5) NOT NULL, 
    LocationName VARCHAR(75) NOT NULL, 

    PRIMARY KEY (LocationID)  
); 

CREATE TABLE Formation 
(
    FormationID CHAR(5) NOT NULL, 
    FormationName VARCHAR(75) NOT NULL, 
    RockType VARCHAR(75) NOT NULL, 
    LocationID INT NOT NULL, 

    PRIMARY KEY (FormationID), 
    FOREIGN KEY (LocationID) REFERENCES Location(LocationID)  
); 

CREATE TABLE Classification 
(
    ClassificationID CHAR(5) NOT NULL, 
    ClassificationType VARCHAR(75) NOT NULL, 
    ClassificationDescription VARCHAR(75) NOT NULL, 
    FormationID VARCHAR(5) NOT NULL, 

    PRIMARY KEY (ClassificationID), 
    FOREIGN KEY (FormationID) REFERENCES Formation(FormationID) 
); 

CREATE TABLE DATA 
(
    FossilID CHAR(5) NOT NULL, 
    FossilName VARCHAR(75) NOT NULL, 
    FossilType VARCHAR(75) NOT NULL, 
    CatalogueDate DATE NOT NULL, 
    ClassificationID VARCHAR(5) NOT NULL, 

    PRIMARY KEY (FossilID), 
    FOREIGN KEY (ClassificationID) REFERENCES Classification(ClassificationID) 
); 

INSERT INTO Location 
VALUES ('001', 'Montana'); 

INSERT INTO Formation 
VALUES ('R01', 'Hell Creek Formation', 'Cretaceous', 001); 

INSERT INTO Classification 
VALUES ('001', 'Saurischia', 'Brachiosauridae', 'Hell Creek Formation'); 

INSERT INTO DATA 
VALUES ('F01', 'Brachiosaurus', 'Vertebrae', '01/MAY/2017', '001'); 
+0

作爲一般的最佳實踐,您應該始終* *指定所插入的列 - 所以用這個,而不是你現在擁有的一切:'INSERT INTO位置(LocationID,LOCATIONNAME)VALUES ('001','Montana');' –

+0

另外:涉及FK關係*的列的數據類型應該相同* - 您的'Location.LocationID'是'CHAR(5)',但是'Formation.LocationID'引用它是'INT' - 做出決定,爲所有人使用** same **數據類型!而且由於'ID'通常是一個數值 - 使用**數字**數據類型 - INT,BIGINT等。do ** not **將數值存儲爲CHAR(5)! ! –

回答

2

INT <>VARCHAR(5) <>CHAR(5)。列應該是相同類型:

CREATE TABLE Location (
LocationID CHAR(5) NOT NULL, 
LocationName VARCHAR(75) NOT NULL, 
PRIMARY KEY (LocationID)  
); 

CREATE TABLE Formation (
FormationID CHAR(5) NOT NULL, 
FormationName VARCHAR(75) NOT NULL, 
RockType VARCHAR(75) NOT NULL, 
LocationID CHAR(5) NOT NULL,    -- here 
PRIMARY KEY (FormationID), 
FOREIGN KEY (LocationID) REFERENCES Location(LocationID)  
); 

CREATE TABLE Classification (
ClassificationID CHAR(5) NOT NULL, 
ClassificationType VARCHAR(75) NOT NULL, 
ClassificationDescription VARCHAR(75) NOT NULL, 
FormationID CHAR(5) NOT NULL,     -- here 
PRIMARY KEY (ClassificationID), 
FOREIGN KEY (FormationID) REFERENCES Formation(FormationID) 
); 

CREATE TABLE DATA (
FossilID CHAR(5) NOT NULL, 
FossilName VARCHAR(75) NOT NULL, 
FossilType VARCHAR(75) NOT NULL, 
CatalogueDate DATE NOT NULL, 
ClassificationID CHAR(5) NOT NULL, 
PRIMARY KEY (FossilID), 
FOREIGN KEY (ClassificationID) REFERENCES  Classification(ClassificationID) 
); 

DBFiddleDemo


而且插入語句:

INSERT INTO Location VALUES ('001', 'Montana'); 
INSERT INTO Formation VALUES ('R01', 'Hell Creek Formation', 'Cretaceous', '001'); --corrected 
INSERT INTO Classification VALUES ('001', 'Saurischia', 'Brachiosauridae', 'R01'); --corrected 
INSERT INTO DATA VALUES ('F01', 'Brachiosaurus', 'Vertebrae', '01/MAY/2017', '001'); 

截斷誤差'Hell Creek Formation'不能適應CHAR(5)。你需要引用PK。也可以考慮使用:

INSERT INTO tab(col_name1, col_name2, ...) 
VALUES(...) 
相關問題