SQLite FOREIGN KEY约束在添加列期间失败

时间:2019-07-02 21:52:26

标签: sqlite

我的问题是,当我尝试向表中添加列时出现外键约束错误。不是一行,而是一列!

我的桌子叫屏幕。它有两个带有外键依赖性的表。它们称为主题和屏幕类型。两个表都非常小,并且每个表只有2列(id和name)。屏幕表包含列TopicId和ScreenTypeId以及其他两列。这三个表都有主索引。在过去的几周中,一切工作正常。

然后,我尝试向Screens表中添加一个名为ScreenNumber的新列。新列为数字,没有任何限制。但是,当我尝试将更改提交到架构时,出现了外键约束错误。

我想我可以通过删除外键约束,添加列,然后再添加外键约束来解决这个问题。但是,当我尝试删除外键约束时,又遇到了另一个外键约束错误。

任何帮助将不胜感激!我不知道是什么原因造成的,我已经超过了这个项目的最后期限。

1 个答案:

答案 0 :(得分:1)

  

我的桌子叫屏幕。它有两个带外键的表   依赖性。它们称为主题和屏幕类型。两个表都是   很小,它们每个只有2列(ID和名称)。的   屏幕表包含列TopicId和ScreenTypeId以及   其他两列。这三个表都有主索引。   在过去的几周中,一切工作都很好。

从上面的内容和您的评论开始,这似乎创建了Screens表,Topics表和ScreenTypes表,并另外在表中填充了一些数据:-

DROP TABLE IF EXISTS Screens;
CREATE TABLE IF NOT EXISTS Screens (
    id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, 
    Video TEXT NOT NULL, 
    TopicId INTEGER NOT NULL, 
    Instructions TEXT, 
    ScreenTypeId INTEGER, 
    SortOrder INTEGER DEFAULT (10), 
    Image TEXT, 
    NewColumn INTEGER, 
    FOREIGN KEY (TopicId) REFERENCES Topics (id), 
    FOREIGN KEY (ScreenTypeId) REFERENCES ScreenTypes (id)
    )
;

DROP TABLE IF EXISTS Topics;
CREATE TABLE IF NOT EXISTS Topics (ID INTEGER PRIMARY KEY, name TEXT);
DROP TABLE IF EXISTS ScreenTypes;
CREATE TABLE IF NOT EXISTS ScreenTypes (ID INTEGER PRIMARY KEY, name TEXT);

INSERT INTO Topics (name) VALUES ('Topic1'),('Topic2'),('Topic3'),('Topic4');
INSERT INTO ScreenTypes (name) VALUES ('SreenType1'),('ScreenType2'),('ScreenType3'),('ScreenType4');
INSERT INTO Screens (Video,TopicId,Instructions,ScreenTypeId,Image,NewColumn) VALUES
    ('Video1',2,'do this 001',3,'Image1','blah'),
    ('Video2',2,'do this 002',3,'Image2','blah'),
    ('Video3',1,'do this 002',1,'Image3','blah'),
    ('Video4',3,'do this 004',4,'Image4','blah'),
    ('Video5',4,'do this 005',1,'Image5','blah')
;
  

然后,我尝试向Screens表添加一个新列,名为   屏幕编号。新列为数字,无限制   任何。但是,当我尝试将更改提交到架构时,我   出现外键约束错误。

以下作品:-

ALTER TABLE Screens ADD COLUMN ScreenNumber INTEGER DEFAULT 100;

按照:-

  ALTER TABLE Screens ADD COLUMN ScreenNumber INTEGER DEFAULT 100
  OK
  Time: 0.083s

,然后使用以下

SELECT * FROM Screens;

结果是:-

enter image description here

  • 可以看出,没有FK约束冲突,并且已经添加了列并应用了默认值100。

我怀疑您与FK约束有关的问题是您正在逐步尝试纠正问题。

首先(猜测),您尝试更改(重新命名)“屏幕”表,但由于Fk约束与“字段”表冲突而不能。然后,您尝试更改Fields表,但由于:-

,仍然会遇到FK冲突
  

如果使用“ ALTER TABLE ... RENAME TO”命令来重命名一个或多个外键约束的父表的表,则外键约束的定义将修改为通过以下方式引用父表:它的新名称。修改子CREATE TABLE语句或存储在sqlite_master表中的语句的文本,以反映新的父表名称。

SQLite Foreign Key Support - 5. CREATE, ALTER and DROP TABLE commands

当然,如果根据您的描述,您只想添加列,则ALTER TABLE Screens ADD COLUMN ScreenNumber INTEGER(如果需要,可以使用默认值)起作用,而无需重命名表。