我刚刚使用 Firebird 数据库发生了一些非常奇怪的事情。
我试图创建一个表,但由于某种原因 CREATE TABLE 失败了。但现在却陷入了一种很奇怪的状态:
如果我尝试使用相同的表名称再次
CREATE TABLE
,则会出现错误:该表已存在。但是,如果我尝试 DROP TABLE
该表,则会出现错误:该表不存在。尝试 SELECT * FROM
该表给出“表不存在”错误,并且该名称未显示在元数据查询中:
SELECT RDB$RELATION_NAME
FROM RDB$RELATIONS
WHERE RDB$SYSTEM_FLAG=0
因此,出于某种原因,该表似乎确实不存在,但我无法创建它,因为某处的某些内容表明它确实存在。
有人知道如何解决这个问题吗?我已经尝试关闭与该数据库的所有连接,这在过去有助于解决不一致问题,但这次没有帮助。
您没有提供有关尝试创建表时出现的错误的详细信息,因此我无法对其进行评论。但是
RDB$RELATIONS
并不是创建表时受影响的唯一系统表。也许您现在处于不一致的情况,其中有关该表的某些信息存在于某些系统表中,而在其他系统表中不存在。
另一个选项是系统表中的索引损坏,因此记录不存在,但索引认为它仍然存在。
尝试进行备份/恢复,看看是否有帮助。如果它不起作用,请尝试在其他系统表(
RDB$RELATION_FIELDS
等)中搜索与该“未创建”表相关的记录,如果找到任何记录,请尝试删除它们。
作为最后一个选项,您可以使用正确的元数据创建一个新的干净数据库,并使用
IBDataPump
将数据注入其中。
我有一个非常类似的问题,所以我希望我可以回答你的问题。我还创建了一个表“MyTable”,并认为它可能未完全创建。
CREATE TABLE MyTable [...];
SHOW TABLES;
显示表的名称。
SELECT * FROM MyTable;
结果:
Statement failed, SQLSTATE = 42S02
Dynamic SQL Error
-SQL error code = -204
-Table unknown
-MYTABLE
-At line 1, column 15
同样的问题
DROP TABLE MyTable
。
我尝试
gfix
修复“损坏”的数据库,但无济于事。
我发现我的表名带有
SELECT RDB$RELATION_NAME FROM RDB$RELATIONS;
,所以我尝试了 DELETE FROM RDB$RELATIONS WHERE RDB$RELATION_NAME = 'MyTable';
,这是不允许的,即使对于用户 SYSDBA 也是如此。
但是您的问题描述有一个区别:
SELECT RDB$RELATION_NAME
FROM RDB$RELATIONS
WHERE RDB$SYSTEM_FLAG=0
返回了我的桌子的名字。这就是为什么我不确定我所描述的问题是否与您的问题相同。
事实证明我只是没有 rtfm 以及它所说的关于双引号的内容。以大写形式显示表名的错误消息应该已经泄露了它。我必须将表的名称放在双引号中才能使命令起作用:
SHOW TABLE "MyTable";
SELECT * FROM "MyTable";
DROP TABLE "MyTable";