2017-08-12 71 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(...) 
相关问题