【问题标题】:Can I change an attribute name from a table derived from a type?我可以从从类型派生的表中更改属性名称吗?
【发布时间】:2020-11-01 18:50:20
【问题描述】:

遵循对象关系数据库模型,我想创建从 t_employee 类型派生的表 or_doctoror_recepcionist。 这里,遵循类型结构:

DROP TYPE t_employee FORCE;
CREATE OR REPLACE TYPE t_employee AS OBJECT (
    num_employee INTEGER,
    name_employee VARCHAR2(50),
    birthdate_employee DATE
);

这里是表格的结构:

DROP TABLE or_doctor CASCADE CONSTRAINTS;
CREATE TABLE or_doctor OF t_employee (
    PRIMARY KEY (num_employee),
    name_employee NOT NULL,
    birthdate_employee NOT NULL
) OBJECT IDENTIFIER IS SYSTEM GENERATED;

DROP TABLE or_recepcionist CASCADE CONSTRAINTS;
CREATE TABLE or_recepcionist OF t_employee (
    PRIMARY KEY (num_employee),
    name_employee NOT NULL,
    birthdate_employee NOT NULL
) OBJECT IDENTIFIER IS SYSTEM GENERATED;

这样做,两个表上的属性名称都将以“employee”结尾。我可以更改属性名称,以便在创建表时它们在每个表中都是特定的吗? 例如:

or_doctor: num_doct, name_doct, birthdate_doct。 表or_recepcionist: num_recep, name_recep, birthdate_recep

【问题讨论】:

  • 为什么要为医生和接待员分开桌子?
  • @June7,因为在巴西,医生有一个名为 CRM 的许可证(可以与美国的 USMLE 相比较),正如我所见,这个属性必须不是 NULL 才能将医生注册到医院数据库,而接收器注册不需要它。
  • 就我个人而言,我更愿意为非医生员工保留 Null 字段 - “规范化直到它受伤,非规范化直到它起作用”。只有两种类型的员工?
  • @June7 是的,只有 2 个。这是作业哈哈。但是,我不得不问。我是对象关系数据库的新手。
  • 好吧,name 或 name_employee 作为字段名称 - 真的没有区别,因为两个表仍然保存员工信息。因此,按照这种观点,您的结构和代码没有任何问题。除非作业要求创建这 2 个表只是为了演示应用技术,否则没有令人信服的理由来拆分数据。

标签: sql oracle object-oriented-database


【解决方案1】:

作为一个框架挑战,不要给你的标识符添加后缀,那么你就不用担心后缀不正确:

CREATE TYPE t_employee AS OBJECT (
    num       INTEGER,
    name      VARCHAR2(50),
    birthdate DATE
);

CREATE TABLE or_doctor OF t_employee (
    PRIMARY KEY (num),
    name      NOT NULL,
    birthdate NOT NULL
) OBJECT IDENTIFIER IS SYSTEM GENERATED;

CREATE TABLE or_receptionist OF t_employee (
    PRIMARY KEY (num),
    name      NOT NULL,
    birthdate NOT NULL
) OBJECT IDENTIFIER IS SYSTEM GENERATED;

如果您尝试重命名该列:

ALTER TABLE or_doctor RENAME COLUMN name TO name_doctor;

然后你会得到错误:

ORA-23291: Only base table columns may be renamed

如果您使用的是对象派生表,那么您似乎会被对象的标识符所困扰;因此,请使对象名称通用,以便它们适用于将要使用的每个地方。

【讨论】:

  • 这与使用 name_employee 或birthdate_employee 有何不同?你是说 OP 想要的东西是不可能的吗?
  • @June7 不,我不相信这是可能的。 CREATE TABLE syntax 似乎不允许这样做,ALTER TABLE .... RENAME COLUMN 引发异常。
  • 啊,我现在明白发生了什么。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-02
  • 1970-01-01
  • 2011-10-09
  • 1970-01-01
  • 2016-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多