SQL> desc dual
Name Null? Type
----------------------------------------- -------- ----------------------------
DUMMY VARCHAR2(1)
SQL> select 4*5 from dual;
4*5
----------
20
SQL>
Run Code Online (Sandbox Code Playgroud)
我觉得真的很奇怪。如果dual中没有名为4*5的列,select语句是如何工作的?
另外,为什么我在创建自己的双表时看不到相同的行为?
SQL> create table dual2(dummy varchar2(1));
Table created.
SQL> desc dual2
Name Null? Type
----------------------------------------- -------- ----------------------------
DUMMY VARCHAR2(1)
SQL> select 4*5 from dual2;
no rows selected
SQL>
Run Code Online (Sandbox Code Playgroud) 我有一个系统,我无法控制某些表的设计(通过 Slony-I 复制),所以我有一系列我们称之为“影子表”的东西,我从复制的表中提取一些信息,并将其存储在我需要的处理形式中,同时剥离我想忽略的记录。
现在,在设置新副本后,我运行更新并将值设置回自身(例如,UPDATE tablename SET field=field
)以强制运行触发器,但有些表有数百万条记录,并且还在增长,可能需要 30 分钟. (然后还有真空)。
有没有更好的方法来触发它,或者有什么方法可以编写一个函数,使其可以处理传入的输入或NEW
取决于调用上下文?我不愿意保留两个不同的功能,因为我已经看到太多次更新一个而不是另一个。
我一直在与一个团队合作,他们建立了一个系统,他们在这个过程中创造了一些新术语,我想知道他们是否应该称之为更标准化的东西。
基本上,他们有保存版本信息的表,所以表的唯一键是被跟踪文档的标识符,加上记录号(尽管记录号是自动编号的,所以它本身是唯一的)。它们将构成文档标识符的字段(它因每个表而变化)称为“主键”......唯一标识符,他们可能互换指为“一个首要键”和A / B / C为“的首要键”
如果他们有一个规范化的数据库,这将是外键的明显候选者——但它没有规范化,所以它不是对不同表的引用。
这个概念有什么名字——一个标识符来选择一些不是表所基于的概念,但不是外键?
更新:它不是备用键,因为它不标识表中的唯一记录;它标识一组记录。看下表:
id document_id version_no
-- ----------- ----------
1 1 1
2 2 1
3 1 2
4 2 2
5 2 3
Run Code Online (Sandbox Code Playgroud)
因此,我们正在跟踪 5 个对象的元数据,它们是两个不同的文件,其中一个已更新一次(它的 2 个版本/版本),另一个已更新两次。
我们有以下几点:
...如果document_id
是与另一个表的关系,它将是一个外键,但“外键”通常也推断出一个约束(即,该值必须存在于其他某个表中才能在此处使用).. . 但在这种情况下,它不是。那么,是否有其他术语可以将其描述为从表中选择相关对象分组而不是单个记录?
维基百科页面上代理键适合的第一个定义,但这不是该术语的常见用法,大多数人认为代理键适合第二个定义:
更新 2:基本上,如果您有一个处理记录版本控制的表,如果您将记录移动到新表并存储编辑历史记录,则链接回原始表的字段将被视为外键……但是如果您将所有内容都存储在一个表中,而与辅助表无关,是否有标识记录多个版本的字段组的名称?
我问的原因是与我一起工作的小组决定称其为“主键”,当我加入时,我查看了他们的所有文档,并告诉他们他们有一个错字,这是'primary key',但他们解释说不,这是他们创造的用来描述这个概念的短语。 …
我遇到过这样的情况,我们的数据库中有几十个不同的触发器,它们触发将记录插入到数据库中的另一个(单个)表中。
我希望在测试我们的替换服务器时,有一些简单的方法可以在该单个表上设置触发器以有效地忽略所有其他触发器。(而不是必须删除数十个触发器,然后在我们投入生产时重新启用它们)。
我希望能够使用INSTEAD OF INSERT
设置为不执行任何操作的函数的触发器,但您只能在视图上使用这些触发器,而不能在表上使用。我尝试了一个BEFORE INSERT
名为的触发器RAISE EXCEPTION
,但这导致整个事务失败,因此对其他表的修改也被拒绝。
是否有一些简单的方法可以忽略对该表的插入,或者我应该做一个AFTER INSERT
事后清除记录的操作?