SQL创建和填充



有经验的人能快速了解以下内容吗。我还不够聪明,无法解决系统错误。


CREATE TABLE TestSubject (
test_subjectID      NCHAR (6)   NOT NULL PRIMARY KEY,
subject_name            NVARCHAR (10)   NOT NULL,
subject_address     NVARCHAR (12)   NOT NULL,
)
;
CREATE TABLE PhNumber (
subject_id      NCHAR (6)   NOT NULL,
ph_number       NVARCHAR (20)   NOT NULL,
PRIMARY KEY (ph_number),
FOREIGN KEY (subject_id) REFERENCES TestSubject (test_subjectID)
);

CREATE TABLE Test (
test_date       DATETIME    NOT NULL,
subject_id      NCHAR (6)   NOT NULL,
result          NVARCHAR (10),
PRIMARY KEY (test_date),
FOREIGN KEY (subject_id) REFERENCES TestSubject (test_subjectID));
CREATE TABLE Place (
place_name      NVARCHAR (10)   NOT NULL PRIMARY KEY,
place_address       NVARCHAR (8),
place_owner     NVARCHAR (8)
);
CREATE TABLE VisitSubject (
v_date          DATETIME    NOT NULL,
v_number        NVARCHAR (20)   NOT NULL,
place_visit     NVARCHAR (10)   NOT NULL,
party_size      INT,
PRIMARY KEY (v_date),
FOREIGN KEY (v_number) REFERENCES PhNumber (ph_number),
FOREIGN KEY (place_visit) REFERENCES Place (place_name));

以及填充脚本

INSERT INTO TestSubject
VALUES 
('S001', 'Daniel Doppler', '5 Beetle Avenue Aberdeen'),
('S002', 'Florence West', '17 Green Crescent Dundee'),
('S003', 'Werner Flick', '25A Grubb Street Stonehaven'),
('S004', 'Tiffany Smith', '11 Green Crescent Dundee'),
('S005', 'Angela Ashe', '113 Wasp Street Aberdeen');

INSERT INTO Test
VALUES
('2020/08/05 00:00:00', 'S001', 'Negative'),
('2020/08/10 00:00:00', 'S002', 'Positive'),
('2020/08/17 00:00:00', 'S003', 'Negative'),
('2020/08/22 00:00:00', 'S004', 'Negative'),
('2020/08/22 00:00:00', 'S005', 'Negative'),
('2020/09/03 00:00:00', 'S001', 'Positive');
INSERT INTO PhNumber
VALUES
('S001', '07123-123456'),
('S002', '07777-111000'),
('S003', '07555-246810'),
('S004', '07101-484848'),
('S004', '07896-102304'),
('S005', '07777-534242');
INSERT INTO Place
VALUES
('Pink Lion Inn', 'Forfar', 'Sean Conran'),
('Irenes Hair Salon', 'Stonehaven', 'Irene Jones');
INSERT INTO VisitSubject
VALUES
('2020/08/01 00:00:00', '07123-123456', 'Irenes Hair Salon', '1'),
('2020/08/01 00:00:00', '07777-111000', 'Irenes Hair Salon', '2'),
('2020/08/25 00:00:00', '07123-123456', 'Pink Lion Inn', '4'),
('2020/08/25 00:00:00', '07493-285113', 'Pink Lion Inn', '2'),
('2020/09/10 00:00:00', '07555-246810', 'Irenes Hair Salon', '1'),
('2020/09/15 00:00:00', '07555-246810', 'Pink Lion Inn', '3');

由于2个错误,我无法填充现有的表-

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

INSERT语句与FOREIGN KEY约束冲突";FK__Test__subject_id_286302EC";。冲突发生在数据库"中;TAT_2012552";,表";dbo。TestSubject";,列"testrongubjectID"。

INSERT语句与FOREIGN KEY约束"冲突;FK__PhNumber__subjec__25869641";。冲突发生在数据库"中;TAT_2012552";,表";dbo。TestSubject";,列"testrongubjectID"。

第一个错误表示您试图在数据类型长度小于该值的列中插入一个值。例如,在VisitSubject表中,place_visit列可以接受包含10个或更少字符的字符串。例如,在您的情况下,无法插入值Irenes Hair Salon,因为它超过了10个字符。

第二个错误是由于表TestPhNumber中插入的subject_id值在表TestSubject中不存在而引发的。为什么它不存在于您的表TestSubject中?因为SQL无法在此表中插入任何行,因为插入的subject_namesubject_address值的字符数超过了表中定义的数据类型长度。

请先解决有关插入比数据类型定义更长的值的问题,然后它应该会解决您的外键问题。

让我们从明显的错误开始:

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

这个错误在很大程度上说明了问题所在,您有一个字符串值正试图插入列中,但它太大,因此该值将被截断。因此,INSERT语句失败。如果您使用的是更新版本的SQL Server,那么实际上会收到更多详细的错误。实际上,您的批次中有3个错误,例如:

表'YourDatabase.dbo.TestSubject'中的字符串或二进制数据将被截断,列'subject_name'。截断的值:"Daniel Dop"。

很明显,您没有使用最新版本的SQL Server,或者您可能已经共享了整个错误,但是,旧错误仍然会告诉您错误所在的表和列。

因此,让我们来看看列YourDatabase.dbo.TestSubject.subject_name,它被定义为nvarchar(10)。仔细看一下INSERT,第一个人的名字是'Daniel Doppler',它超过了10个字符,因此出现了错误。事实上,对于每个字符串值,整个INSERT语句都将失败,因为您的subject_address列被定义为nvarchar(12),但您尝试INSERT的第一个值是'5 Beetle Avenue Aberdeen',这是方式超过12个字符。

那么你该如何解决这个问题呢?修复表的定义并增加列的大小;显然10和12个字符对于一个"数字"来说是不够的;受试者的";姓名和地址。


那么,其他错误呢,比如:

INSERT语句与FOREIGN KEY约束冲突";FK__Test__subject_id_29572725";。冲突发生在数据库"中;YourDatabase";,表";dbo。TestSubject";,列"testrongubjectID"。

好吧,这实际上是你之前错误的结果;你的INSERT失败了,因为你试图INSERT数据对你的列来说太大了,所以它不是INSERT。然后,当你进入下一个INSERT语句时,外键约束(它有一个钝名称,因为你没有给它一个,但我们稍后会讨论)失败了,它是CHECK,因为表dbo.TestSubject中没有行。实际上,先前的截断误差只会使问题更加复杂。


正如我所提到的,这些错误发生多次,在该批中有3个截断错误;意味着3个CCD_ 26语句由于列太小而值不适合而失败;您需要修复这些表中的每一个定义,以便它们的长度适合您插入的数据。您也有2个外键约束失败,但当您修复表定义时,这些失败可能会消失。


正如我所提到的,我确实建议命名您的约束。您可以通过使用ALTER语句并在其中创建CONSTRAINT来实现这一点。例如:

CREATE TABLE dbo.PhNumber (subject_id nchar(6) NOT NULL,
ph_number nvarchar(20) NOT NULL);
ALTER TABLE dbo.PhNumber ADD CONSTRAINT PK_PhNumber PRIMARY KEY CLUSTERED (ph_number);
ALTER TABLE dbo.PhNumber ADD CONSTRAINT FK_PhNumber_TestSubject FOREIGN KEY (subject_id) REFERENCES dbo.TestSubject (test_subjectID);

这将其中一个关于外键失败的错误更改为以下错误;这必须更容易理解,因为密钥的名称:

INSERT语句与FOREIGN KEY约束冲突";FK_PhNumber_TestSubject";。冲突发生在数据库"中;YourDatabase";,表";dbo。TestSubject";,列"testrongubjectID"。

相关内容

  • 没有找到相关文章

最新更新