- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的UWP应用中,我正在sqlite数据库中的“应用开始”上创建表。另外,我编写了各种Alter命令,其中我检查安装的应用程序是否包含Customertbl中的相应列,并将Customertbl表重命名为Customertbl_old并创建新表Customertbl,最后我将Customertbl_old表中的所有行存储到Customertbl表中。然后我删除表Customertbl_old。
现在,到目前为止,一切都可以正常工作,但是,当我尝试在OwnerTbl中删除/插入一行时,它将引发异常,
SQLite错误:没有这样的表main.Customertbl_old存在。
//**Code where a column name is updated by creating new table**
string tableCommand = "PRAGMA table_info(Recordings)";
SqliteCommand createTable = new SqliteCommand(tableCommand, db);
SqliteDataReader query = createTable.ExecuteReader();
tableCommand = "PRAGMA foreign_keys = off; " + "
BEGIN TRANSACTION; " +
" ALTER TABLE Customertbl RENAME TO _Customertbl_old; " +
" CREATE TABLE Customertbl ( " + " ID INTEGER PRIMARY KEY AUTOINCREMENT, " + " CustomerName NVARCHAR(100) NULL, " + " Password NVARCHAR(100) NULL, " + "
pkID INTEGER NULL, " + " ActivityName NVARCHAR(255) NULL);" +
" INSERT INTO Customertbl(Name,Password) " + " SELECT Name,Password " + "
FROM _Customertbl_old ;" + " COMMIT; " + " PRAGMA foreign_keys=on; " + "
DROP TABLE
_Customertbl_old";
// **code where exception occur**
using (SqliteConnection db = new
SqliteConnection("Filename=" + App.dbName))
{
db.Open();
SqliteCommand deleteCommand = new SqliteCommand();
try
{
deleteCommand.Connection = db;
deleteCommand.CommandText = "DELETE FROM Ownertbl where fkId = @id";
deleteCommand.Parameters.AddWithValue("@id", id);
deleteCommand.ExecuteReader()//here the exception occur ;
db.Close();
}
}
最佳答案
发生了什么
由于在版本3.25.0(2018-09-15)和3.26.0(2018-12-01)中对SQLite的ALTER TABLE
命令进行了更改,因此出现了您的问题。有关官方文档,请参见SQLite网站上的ALTER TABLE。
在此版本之前,重命名表(例如,从MY_TABLE
到A_BETTER_NAMED_TABLE
)只能更改表的名称。对该表的任何引用(即在外键(FK)约束或触发器中)均未重命名。如果目标是仅重命名表,则可以合理地将其视为错误,因为没有(简便,正式)的方式来更改这些引用,并且您将获得不一致的数据库。
上面的更改通过将对表名的更改传播到任何此类引用中来“解决”了此问题。因此,您可以重命名由FK约束或触发器引用的表,并保留一个一致的数据库。
何时引起问题
由于ALTER TABLE
命令的能力非常有限(与非Lite数据库引擎相比),OP的问题间接地出现了。在SQLite中,它所能做的就是更改表名,列名或添加新列(到行的“结尾”)。如果您需要对表执行比该表更复杂的操作,则必须进行“创新”(本质上是,创建一个新的替换表并从旧表中填充它)。但是,有两种方法可以做到这一点,其中一种被上述更改“试图变得更有用”而“中断”。
安全的方法
使用所需的所有新属性创建一个新的(例如MY_TABLE_NEW
)。
将现有数据从MY_TABLE
迁移到MY_TABLE_NEW
(适当添加默认值/缺失值)。
删除原始表MY_TABLE
。此时,任何引用MY_TABLE
的FK约束和触发器都将失败,但这无关紧要。
使用ALTER TABLE MY_TABLE_NEW RENAME TO MY_TABLE
将格式正确的新表的名称更改回原始表的名称。现在将再次满足所有FK约束/触发器引用(假定它们不针对已删除的列!)
上面的内容在更改之前和之后都适用。更改之前,无需关注FK约束/触发器;更改后,将不再引用MY_TABLE_NEW
,因此不会传播任何内容。
断路
在更改之前,以下过程将同样有效:
使用ALTER TABLE MY_TABLE RENAME TO MY_TABLE_OLD
。在这一点上,在旧版本中,任何FK内容/触发都将不一致,但这无关紧要。
使用所需的所有新属性创建替换表MY_TABLE
。现在将满足所有引用。
将现有数据从MY_TABLE_OLD
迁移到MY_TABLE
(适当添加默认值/缺失值)。
删除原始(但已重命名)表MY_TABLE_OLD
。
新版本会出现问题,因为它将重命名对原始表(MY_TABLE
)的所有引用,从而使它们现在可以引用即将删除的表(MY_TABLE_OLD
)。其他步骤均不会影响这些引用,因此您将获得一个不一致的数据库(对不存在的MY_TABLE_OLD
的引用)。
修复
可以将表操作步骤的顺序更改为“安全方式”中的顺序,也可以按照ALTER TABLE页上的说明,在PRAGMA legacy_alter_table=ON
命令之前发出命令ALTER TABLE
。这将防止“改进”行为将对MY_TABLE
的引用重命名为MY_TABLE_OLD
。
关于c# - SQLite错误:不存在这样的表main.table_name,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57253045/
我已经使用 vue-cli 两个星期了,直到今天一切正常。我在本地建立这个项目。 https://drive.google.com/open?id=0BwGw1zyyKjW7S3RYWXRaX24tQ
您好,我正在尝试使用 python 库 pytesseract 从图像中提取文本。请找到代码: from PIL import Image from pytesseract import image_
我的错误 /usr/bin/ld: errno: TLS definition in /lib/libc.so.6 section .tbss mismatches non-TLS reference
我已经训练了一个模型,我正在尝试使用 predict函数但它返回以下错误。 Error in contrasts<-(*tmp*, value = contr.funs[1 + isOF[nn]])
根据Microsoft DataConnectors的信息我想通过 this ODBC driver 创建一个从 PowerBi 到 PostgreSQL 的连接器使用直接查询。我重用了 Micros
我已经为 SoundManagement 创建了一个包,其中有一个扩展 MediaPlayer 的类。我希望全局控制这个变量。这是我的代码: package soundmanagement; impo
我在Heroku上部署了一个应用程序。我正在使用免费服务。 我经常收到以下错误消息。 PG::Error: ERROR: out of memory 如果刷新浏览器,就可以了。但是随后,它又随机发生
我正在运行 LAMP 服务器,这个 .htaccess 给我一个 500 错误。其作用是过滤关键字并重定向到相应的域名。 Options +FollowSymLinks RewriteEngine
我有两个驱动器 A 和 B。使用 python 脚本,我在“A”驱动器中创建一些文件,并运行 powerscript,该脚本以 1 秒的间隔将驱动器 A 中的所有文件复制到驱动器 B。 我在 powe
下面的函数一直返回这个错误信息。我认为可能是 double_precision 字段类型导致了这种情况,我尝试使用 CAST,但要么不是这样,要么我没有做对...帮助? 这是错误: ERROR: i
这个问题已经有答案了: Syntax error due to using a reserved word as a table or column name in MySQL (1 个回答) 已关闭
我的数据库有这个小问题。 我创建了一个表“articoli”,其中包含商品的品牌、型号和价格。 每篇文章都由一个 id (ID_ARTICOLO)` 定义,它是一个自动递增字段。 好吧,现在当我尝试插
我是新来的。我目前正在 DeVry 在线学习中级 C++ 编程。我们正在使用 C++ Primer Plus 这本书,到目前为止我一直做得很好。我的老师最近向我们扔了一个曲线球。我目前的任务是这样的:
这个问题在这里已经有了答案: What is an undefined reference/unresolved external symbol error and how do I fix it?
我的网站中有一段代码有问题;此错误仅发生在 Internet Explorer 7 中。 我没有在这里发布我所有的 HTML/CSS 标记,而是发布了网站的一个版本 here . 如您所见,我在列中有
如果尝试在 USB 设备上构建 node.js 应用程序时在我的树莓派上使用 npm 时遇到一些问题。 package.json 看起来像这样: { "name" : "node-todo",
在 Python 中,您有 None单例,在某些情况下表现得很奇怪: >>> a = None >>> type(a) >>> isinstance(a,None) Traceback (most
这是我的 build.gradle (Module:app) 文件: apply plugin: 'com.android.application' android { compileSdkV
我是 android 的新手,我的项目刚才编译和运行正常,但在我尝试实现抽屉导航后,它给了我这个错误 FAILURE: Build failed with an exception. What wen
谁能解释一下?我想我正在做一些非常愚蠢的事情,并且急切地等待着启蒙。 我得到这个输出: phpversion() == 7.2.25-1+0~20191128.32+debian8~1.gbp108
我是一名优秀的程序员,十分优秀!