oracle数据库拼接引号
在我的上一篇文章中 ,我提到了使用双引号在Oracle标识符中显式指定大小写的缺点是可能会将字符串文字与单引号混淆。 尽管我个人并不认为这是避免在Oracle中避免对标识符使用双引号的充分理由,但是值得意识到这种潜在的混淆。 何时使用单引号与何时使用双引号一直是数据库新用户在一段时间以来会区分两者的困惑。 在这篇文章中,我看一个例子,说明在没有引号的情况下意外滥用单引号会导致创建不必要的索引的情况。
简单脚本createPersonTable.sql
SQL 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');
我们可能希望看起来明确创建主键列索引的语句失败,因为该列已被索引。 如下面的输出所示,它不会失败。
当对索引运行查询时,很明显为什么显式索引创建没有失败。 它没有失败,因为它没有在同一列上创建另一个索引。 似乎是“ id”列名的单引号实际上使“ id”成为字符串文字而不是列名,并且创建的索引是基于函数的索引,而不是列索引。 这显示在下一个屏幕快照中的查询中。
名为PEOPLE_PK_INDEX的索引是在脚本中显式创建的索引,并且是基于函数的索引 。 隐式创建的主键列索引具有系统生成的名称。 在此示例中,基于函数的索引是无用的索引,不提供任何值。
有趣的是,当我尝试使用带有“ id”和“ ID”的双引号在列上显式创建索引时会发生什么。 第一个“ id”失败(“无效标识符”),因为Oracle大小写将表创建中的名称“ id”隐式折叠为大写的“ ID”。 第二个“ ID”失败(“该列列表已被索引”),因为在这种尝试中,我最终试图在已经隐式为其创建索引的同一列上创建索引。
在我的原始示例中,将文字字符串作为“列”传递给索引创建语句导致其被创建为基于函数的无用索引。 如果尚未隐式创建预期的主键列索引,可能会更糟,因为那样的话,我可能没有我以为的索引。 当然,在为没有隐式为其创建索引的列或列列表创建索引时,可能会发生这种情况。 没有错误消息警告我们单引号字符串被视为字符串文字而不是列名称。
结论
在Oracle数据库中使用引号时要记住的一般经验法则是,双引号用于标识符(例如列名和表名),单引号用于字符串文字。 如这篇文章所展示的,有时可能会误用一个而不是另一个,而导致未预期的结果,而不必显示错误消息。
oracle数据库拼接引号