带有对象类型 PRIMARY KEY 的 PL/SQL

Posted

技术标签:

【中文标题】带有对象类型 PRIMARY KEY 的 PL/SQL【英文标题】:PL/SQL With Object Types PRIMARY KEY 【发布时间】:2016-10-01 14:45:18 【问题描述】:

我创建了如下的对象关系类型。

CREATE OR REPLACE TYPE familycar_t AS OBJECT (
make VARCHAR (10),
model VARCHAR(10),
year NUMBER (4),
fuel_type VARCHAR (10));
/

CREATE OR REPLACE TYPE sedan_t AS OBJECT (
familycar ref familycar_t,
cylinder_Size  number(10));
/

CREATE TABLE familycar OF familycar_t (PRIMARY KEY (make,model));

现在我想为“轿车”表设置主要如下。

CREATE TABLE sedan OF sedan_t (PRIMARY KEY (familycar_t.make,familycar_t.model));

但是会发生错误,

从第 4 行开始的错误命令 - CREATE TABLE 轿车 OF 轿车 (PRIMARY KEY (familycar_t.make,familycar_t.model)) 错误报告 - SQL 错误:ORA-00904:“FAMILYCAR_T”。“MAKE”:标识符无效 00904. 00000 - “%s:无效标识符” *原因: *行动:

解决办法是什么?

【问题讨论】:

你试过了吗:PRIMARY KEY (familycar.make, familycar.model)?也就是说,引用对象,而不是类型。 我尝试了以下方法,但不正确... CREATE TABLE 轿车 OF 轿车 (PRIMARY KEY (make%familycar,model%familycar));创建表轿车的轿车(主键(familycar.make%familycar_t,familycar.model%familycar_t)); CREATE TABLE 轿车 OF 轿车 (PRIMARY KEY (familycar.make%familycar_t,familycar.model%familycar_t)); 【参考方案1】:

使用引用的替代方法是使用继承:

CREATE OR REPLACE TYPE familycar_t AS OBJECT (
  make VARCHAR (10),
  model VARCHAR(10),
  year NUMBER (4),
  fuel_type VARCHAR (10)
) NOT FINAL;
/

CREATE OR REPLACE TYPE sedan_t UNDER familycar_t (
  cylinder_Size  number(10)
);
/

CREATE TABLE familycar OF familycar_t (PRIMARY KEY (make,model));

CREATE TABLE sedan OF sedan_t (PRIMARY KEY (make,model));

但是,在这种情况下,您实际上并不需要 sedan 表:

INSERT INTO familycar
SELECT sedan_t( 'Ford', 'Model-T', 1908, 'Petrol', 4 ) FROM DUAL UNION ALL
SELECT familycar_t( 'Ford', 'Model-A', 1903, 'Petrol' ) FROM DUAL;

SELECT f.*,
       TREAT( VALUE(f) AS sedan_t ).cylinder_size AS cylinder_size
FROM   familycar f;

输出

MAKE       MODEL            YEAR FUEL_TYPE  CYLINDER_SIZE
---------- ---------- ---------- ---------- -------------
Ford       Model-T          1908 Petrol                 4 
Ford       Model-A          1903 Petrol            (null) 

【讨论】:

【参考方案2】:

您不能在类型为 REF 的属性上创建索引(请参阅here)。 如果 REF 是作用域的,则只能在 REF 属性或列上定义索引。

CREATE OR REPLACE TYPE sedan_t AS OBJECT (
    familycar familycar_t,
    cylinder_Size  number(10)
    );
/
CREATE TABLE sedan OF sedan_t (PRIMARY KEY (familycar.make, familycar.model));

Table SEDAN created.

【讨论】:

以上是关于带有对象类型 PRIMARY KEY 的 PL/SQL的主要内容,如果未能解决你的问题,请参考以下文章

mysql中key和primary key的区别

(转)sql 违反了 PRIMARY KEY 约束,不能在对象 中插入重复键

MySQL中出现Multiple primary key defined报错提示之解决办法

违反 PRIMARY KEY 约束“PK_EMPLOYEE”。无法在对象中插入重复键

SQL 服务器查询以获取表中的列列表以及数据类型、NOT NULL 和 PRIMARY KEY 约束

违反 PRIMARY KEY 约束