添加列期间Sqlite外键约束失败

添加列期间Sqlite外键约束失败,sqlite,Sqlite,我的问题是,当我尝试向表中添加列时,会出现外键约束错误。不是一行,而是一列 我的桌子叫屏风。它有两个具有外键依赖关系的表。它们被称为主题和屏幕类型。这两个表都非常小,每个id和名称只有2列。Screens表包含TopicId和ScreenTypeId列以及其他两列。这三个表都有主索引。在过去的几周里,一切都很顺利 然后,我尝试在Screens表中添加一个名为ScreenNumber的新列。新列是数字列,没有任何限制。但是,当我尝试将更改提交到模式时,出现了一个外键约束错误 我想我可以通过删除外键

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

我的桌子叫屏风。它有两个具有外键依赖关系的表。它们被称为主题和屏幕类型。这两个表都非常小,每个id和名称只有2列。Screens表包含TopicId和ScreenTypeId列以及其他两列。这三个表都有主索引。在过去的几周里,一切都很顺利

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

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

任何帮助都将不胜感激!我不知道是什么原因造成了这一点,我过去了我的最后期限,为这个项目

我的桌子叫屏风。它有两个带外键的表 依赖关系。它们被称为主题和屏幕类型。两张桌子都是 非常小,每个id和名称只有2列。这个 Screens表包含TopicId和ScreenTypeId列以及 其他几列。这三个表都有主索引。 在过去的几周里,一切都很顺利

根据以上内容和您的评论,这将创建屏幕表、主题表和屏幕类型表,并用一些数据填充这些表:-

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;
根据:-

然后使用下面的

SELECT * FROM Screens;
结果是:-

如图所示,没有FK约束冲突,已添加列并应用默认值100。 我怀疑您的FK约束问题在于您正在逐步尝试纠正问题

首先,您可能尝试更改Screens表的重命名,但由于Fk约束与Fields表冲突,因此无法更改。然后尝试更改Fields表,但仍然会出现FK冲突,原因是:-

如果改变表格。。。“重命名为”命令用于重命名作为一个或多个外键约束的父表的表,修改外键约束的定义以通过其新名称引用父表。子CREATE TABLE语句或存储在sqlite_主表中的语句的文本将被修改以反映新的父表名称


当然,如果根据您的描述,您只想添加列,那么ALTER TABLE Screens添加列ScreenNumber INTEGER和默认值(如果需要),则无需重命名表。

您的新列是否具有默认值或不为空?这两种情况都可能导致外键约束错误。您是否可以发布SQL表以插入列,以便我们了解可能发生的一切?如果您也发布SQL以重新创建表,我们可以尝试了解发生的一切。请将它们添加到问题中,然后删除注释。它有助于将所有这些信息保持在一起。另外,不要忘记使用适当的代码格式。通过编辑而不是注释来澄清。PS这将是一个常见问题。用谷歌搜索你的错误消息,但不使用你的特定名称/字符串/行。哇!谢谢你的帮助。我没有意识到Sqlite必须构建临时表并将数据复制到其中以添加新列。你是对的。我有另一个表叫做Fields,它依赖于屏幕。当我将该列添加到Screens时,它重命名了Screens和Fields,并试图复制这两个字段。副本适用于屏幕,但字段有一些外键问题。我的字段表中有一些行指向不存在的ScreenId。在我插入第一行数据之前,这些表上的FK约束从一开始就存在。我的数据库正在被C应用程序访问。我的应用程序是否可能以某种方式禁用了FK?@Mikutus默认情况下,FK是关闭的,因此您必须打开它们。请参阅答案第2节中的链接。
SELECT * FROM Screens;