我们可以将主键用作普通列吗?

时间:2012-08-09 13:24:00

标签: oracle

我们可以在Oracle中使用主键作为“普通列”吗? 我正在尝试执行以下查询,但它不起作用:

SELECT DATA_1,DATA_2 FROM MY_TABLE WHERE MY_TABLE_PK=10;

我有一个无效的标识符错误:

 SQL Error: ORA-00904: "MY_TABLE_PK": invalid identifier

在这些情况下,我们如何读取主键值?

非常感谢你的时间。

3 个答案:

答案 0 :(得分:4)

您的主键INDEX基于表格中的主键COLUMN,全部为constraints

您可以选择主键COLUMN,但INDEX是数据库中的单独对象,无法自行选择(您无论如何都不想要)。在您的情况下,主键约束本身可能强制主键列中的唯一性,以及通过使用索引减少搜索时间。

我认为你的术语可能会有些混乱。

如果您不确定,请查询user_ind_columns字典视图以查找索引所基于的主键列:

SELECT *
  FROM user_ind_columns
 WHERE index_name = 'MY_TABLE_PK';

然后将基础COLUMN(S)(可能不止一个)添加到您的选择查询中以使其返回。

希望它有所帮助...

答案 1 :(得分:1)

主键是普通列,是的,您只需选择或使用where子句中的列即可。

在SQL中,您选择DATA_1两次 - 表中是否有一个名为MY_TABLE_PK的列?

主键的名称显示在解释计划中,但您选择的数据将是列名,而不是主键名。

e.g。

CREATE TABLE supplier
(   supplier_id     numeric(10)     not null,
    supplier_name   varchar2(50)    not null,
    contact_name    varchar2(50),   
    CONSTRAINT supplier_pk PRIMARY KEY (supplier_id)
); 

这里的主键叫做supplier_pk,使用的是submission_id列,所以我们可以像这样选择

SELECT supplier_name from supplier where supplier_id=1234;

答案 2 :(得分:0)

我假设MY_TABLE的主键是MY_TABLE_PK。如果是这样,您发布的查询永远不会读取该列。尝试将您的查询更改为

SELECT MY_TABLE_PK, DATA_1
  FROM MY_TABLE
  WHERE MY_TABLE_PK = 10

这假设MY_TABLE_PK包含10行。

分享并享受。