在Oracle中设置对象类型表的主键

Posted

技术标签:

【中文标题】在Oracle中设置对象类型表的主键【英文标题】:Setting the primary key of a object type table in Oracle 【发布时间】:2010-03-08 07:16:02 【问题描述】:

我有两个 Oracle 问题。

    当表由对象类型组成时,如何设置表的主键?例如

    CREATE TABLE object_names OF object_type

    我已经创建了一个 Varray 类型,

    CREATE TYPE MULTI_TAG AS VARRAY(10) OF VARCHAR(10);

    但是当我尝试这样做时

    从 pg_photos p 中选择 p.tags.count;

    “计数”部分出现无效标识符错误。 p.tags 是一个 MULTI_TAG,如何获取 MULTI_TAG 中的元素个数?

【问题讨论】:

欢迎来到 ***!正如您已经意识到的那样,您问了 两个 Oracle 问题。因此,请编辑此问题以删除一个问题,并将其作为一个单独的问题提出。 【参考方案1】:

首先,我不建议将数据存储在 Object 表中。对象是一个很好的编程工具,但查询对象表会导致复杂的 SQL。我建议将您的数据存储在标准关系模型中并在您的过程中使用对象。

现在回答你的问题:

    主键应该是不可变的,因此大多数时候 Object 类型不适合主键。您应该定义一个surrogate key 来引用您的对象。

    您必须将 varray 转换为表才能从 SQL 查询它

例如:

SQL> CREATE TYPE MULTI_TAG AS VARRAY(10) OF VARCHAR(10);
  2  /
Type created

SQL> CREATE TABLE pg_photos (ID number, tags multi_tag);
Table created

SQL> INSERT INTO pg_photos VALUES (1, multi_tag('a','b','c'));
1 row inserted

SQL> INSERT INTO pg_photos VALUES (2, multi_tag('e','f','g'));
1 row inserted

SQL> SELECT p.id, COUNT(*)
  2    FROM pg_photos p
  3         CROSS JOIN TABLE(p.tags)
  4   GROUP BY p.id;

        ID   COUNT(*)
---------- ----------
         1          3
         2          3

【讨论】:

我同意使用对象表确实很复杂,不幸的是我没有选择余地。作业要求我使用对象关系功能。感谢您的意见。我已经通过 vark.com 找到了答案,但我没有使用 CROSS JOIN,所以我需要研究一下它的作用。 @Rek: 交叉连接是 没有 连接条件的连接。在您的回答中,您加入了 pg_photosTABLE(p.tags) 没有 where 子句,这是一个交叉连接。【参考方案2】:

1) 主键是一个约束,要在对象表上添加约束,请查看此链接:http://download-west.oracle.com/docs/cd/B28359_01/appdev.111/b28371/adobjdes.htm#i452285

2) SQL 语句中不能使用 COUNT 方法: 参考评论中的链接

所以在我的情况下,我必须这样做

SELECT p.pid AS pid, count(*) AS num_tags FROM pg_photos p, TABLE(p.tags) t2 GROUP BY p.pid;

【讨论】:

#2 的链接是download.oracle.com/docs/cd/B14117_01/appdev.101/b10807/…

以上是关于在Oracle中设置对象类型表的主键的主要内容,如果未能解决你的问题,请参考以下文章

关于oracle中 根据一个表的主键数据同步更新另一个关联表的字段。

ORACLE: 查询(看)表的主键外键唯一性约束和索引

在SQL SERVER 中对表不能设置主键

oracle 怎么修改主键类型

oracle中设置1位的整型问题

如何使用 RKObjectMapping 在嵌套的 RLMObject 中设置相同的主键?