我在SQL Server上不断遇到错误-字符串&;二进制数据截断,外键约束

我在SQL Server上不断遇到错误-字符串&;二进制数据截断,外键约束,sql,sql-server,tsql,foreign-keys,Sql,Sql Server,Tsql,Foreign Keys,我不熟悉SQL和SQL Server。我正在尝试实现一个小型数据库。然而,我一直有三个错误 错误#1: 字符串或二进制数据将被截断 错误#2: INSERT语句与外键约束“FK__Formation__Locat__25869641”冲突 错误#3: INSERT语句与外键约束“FK__DATA__Classifica__2B3F6F97”冲突 我尝试了各种不同的改变,但似乎没有任何效果。有人能解释一下我做错了什么吗?谢谢 CREATE TABLE Location ( Locatio

我不熟悉SQL和SQL Server。我正在尝试实现一个小型数据库。然而,我一直有三个错误

错误#1:

字符串或二进制数据将被截断

错误#2:

INSERT语句与外键约束“FK__Formation__Locat__25869641”冲突

错误#3:

INSERT语句与外键约束“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');
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)
);


以及您的insert语句:

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'
无法容纳
字符(5)
。你需要参考PK。同时考虑使用:

INSERT INTO tab(col_name1, col_name2, ...)
VALUES(...)
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)
);


以及您的insert语句:

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'
无法容纳
字符(5)
。你需要参考PK。同时考虑使用:

INSERT INTO tab(col_name1, col_name2, ...)
VALUES(...)

作为一般最佳实践,您应该始终指定要插入的列-因此使用它而不是现在的:
INSERT-into-Location(LocationID,LocationName)值('001','Montana')
另外:FK关系中涉及的列的数据类型应该相同-您的
位置。LocationID
CHAR(5)
,但是
格式。LocationID
引用它的是
INT
-下定决心,对所有列使用相同的数据类型!由于
ID
通常是数值-使用数值数据类型-
INT
BIGINT
等-不要将数值存储为
CHAR(5)
!!作为一般最佳实践,您应该始终指定要插入的列-因此使用它而不是现在的:
INSERT-into-Location(LocationID,LocationName)值('001','Montana')
另外:FK关系中涉及的列的数据类型应该相同-您的
位置。LocationID
CHAR(5)
,但是
格式。LocationID
引用它的是
INT
-下定决心,对所有列使用相同的数据类型!由于
ID
通常是数值-使用数值数据类型-
INT
BIGINT
等-不要将数值存储为
CHAR(5)
!!