oracle数据库拼接引号_Oracle数据库索引列规范中的单引号

本文探讨了在Oracle数据库中如何正确使用单引号和双引号,以避免将字符串文字与列名混淆。通过示例说明,未正确引用的单引号可能导致创建不必要的基于函数的索引,而非预期的列索引,强调了在数据库操作中区分标识符引用和字符串引用的重要性。
摘要由CSDN通过智能技术生成

oracle数据库拼接引号

在我的一篇文章中 ,我提到了使用双引号在Oracle标识符中显式指定大小写的缺点是可能会将字符串文字与单引号混淆。 尽管我个人并不认为这是避免在Oracle中避免对标识符使用双引号的充分理由,但是值得意识到这种潜在的混淆。 何时使用单引号与何时使用双引号一直是数据库新用户在一段时间以来会区分两者的困惑。 在这篇文章中,我看一个例子,说明在没有引号的情况下意外滥用单引号会导致创建不必要的索引的情况。

简单脚本createPersonTable.sqlSQL createPersonTable.sql生成一个名为PEOPLE的表,并将为此表的主键ID列隐式创建一个索引。 但是,该脚本还包含一个显式的索引创建语句,乍一看似乎可以在此主键列上创建索引。

createPersonTable.sql

CREATE TABLE people
(
   id number PRIMARY KEY,
   last_name varchar2(100),
   first_name varchar2(100)
);

CREATE INDEX people_pk_index ON people('id');

我们可能希望看起来明确创建主键列索引的语句失败,因为该列已被索引。 如下面的输出所示,它不会失败。

createPersonTable成功

当对索引运行查询时,很明显为什么显式索引创建没有失败。 它没有失败,因为它没有在同一列上创建另一个索引。 似乎是“ id”列名的单引号实际上使“ id”成为字符串文字而不是列名,并且创建的索引是基于函数的索引,而不是列索引。 这显示在下一个屏幕快照中的查询中。

queryingIndexesOnColumnAndLiteralStringFunctional

名为PEOPLE_PK_INDEX的索引是在脚本中显式创建的索引,并且是基于函数的索引 。 隐式创建的主键列索引具有系统生成的名称。 在此示例中,基于函数的索引是无用的索引,不提供任何值。

有趣的是,当我尝试使用带有“ id”和“ ID”的双引号在列上显式创建索引时会发生什么。 第一个“ id”失败(“无效标识符”),因为Oracle大小写将表创建中的名称“ id”隐式折叠为大写的“ ID”。 第二个“ ID”失败(“该列列表已被索引”),因为在这种尝试中,我最终试图在已经隐式为其创建索引的同一列上创建索引。

在我的原始示例中,将文字字符串作为“列”传递给索引创建语句导致其被创建为基于函数的无用索引。 如果尚未隐式创建预期的主键列索引,可能会更糟,因为那样的话,我可能没有我以为的索引。 当然,在为没有隐式为其创建索引的列或列列表创建索引时,可能会发生这种情况。 没有错误消息警告我们单引号字符串被视为字符串文字而不是列名称。

结论

在Oracle数据库中使用引号时要记住的一般经验法则是,双引号用于标识符(例如列名和表名),单引号用于字符串文字。 如这篇文章所展示的,有时可能会误用一个而不是另一个,而导致未预期的结果,而不必显示错误消息。

翻译自: https://www.javacodegeeks.com/2015/10/single-quotes-in-oracle-database-index-column-specification.html

oracle数据库拼接引号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值