【问题标题】:Key preserved table密钥保留表
【发布时间】:2020-09-08 06:56:17
【问题描述】:

我正在尝试通过视图更新表,但我不断收到列未映射到键保留表的错误。有人可以解释为什么这些表没有保留密钥吗?

我得到的错误是:

SQL 错误:ORA-01779: não é possível modificar uma coluna que compatiblee a uma tabela que não é mantida por chaves 01779. 00000 - “不能修改映射到非键保留表的列” *原因:试图插入或更新连接视图的列 映射到非键保留表。 *Action:直接修改底层基表。

代码:

create table Pessoa
(
    cartaoCidadao integer check(cartaoCidadao <= 99999999) not null,
    nome VARCHAR(35) check(nome not like '%[0-9]%') not null,
    email varchar(35) not null,
    dataDeNascimento date not null,
    genero varchar(9) check(genero in('Masculino','Feminino')) not null,
    primary key(cartaoCidadao)
);

create table Membro
(
    cartaoCidadao integer  check(cartaoCidadao <= 99999999) not null ,
    nivel varchar(8) not null,
    primary key (cartaoCidadao),
    foreign key (cartaoCidadao) references Pessoa(cartaoCidadao),
    foreign key (nivel) references Escalao(nivel)
);

create table Escalao
(
    nivel varchar(8)  not null,
    primary key(nivel)
);

create or replace view membroView 
as
     select cartaoCidadao, nome, email, dataDeNascimento, genero, nivel
     from Pessoa 
     inner join Membro using(cartaoCidadao) 
     inner join telemoveis using (cartaoCidadao);

update membroView
set nome = 'Hello'
where cartaoCidadao = 123;

【问题讨论】:

  • 请也发布错误详情。还有你的 Oracle 版本。
  • 我添加了错误,但我不知道我使用的是哪个 oracle 版本,因为这是一项大学作业,我们只是使用提供给我们的任何我可以检查的方式吗?
  • 据我所知,Oracle 的LIKE 不匹配像%[0-9]% 这样的正则表达式。您需要使用正则表达式的函数。
  • 这会影响被密钥保留的表吗?因为该检查按预期工作。
  • 您的视图引用了一个额外的表 telemoveis,您没有提供该表的描述。

标签: sql oracle


【解决方案1】:

保留键意味着基表中的行将出现在 MOST ONCE 在该表的输出视图中。

(https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:548422757486)

目前还不完全清楚,因为您还没有提供所有相关的表定义,但基本上该错误表明 Oracle 无法保证 Pessoa 中的任何给定行对应于视图中的一或零行。

由于PessoaMembro 具有相同的主键(顺便说一句,这似乎很奇怪),这可能意味着未描述的表telemoveis 对于给定的@987654326 值可以有不止一行@。

【讨论】:

  • 我忘记删除不应该存在的对表 telemoveis 的引用,但无论如何感谢您的回答
【解决方案2】:

MEMBRO 是此查询中唯一保留键的表。视图中的任何查询将最多从 MEMBRO 返回每一行的一个副本,但如果它们通过其外键链接到多个 MEMBRO,它可能会从 PESSOA 或 ESCALAO 返回多个行的副本。因此它们不是密钥保留的,因此您可能不会更新 PESSOA.nome。

【讨论】:

    猜你喜欢
    • 2013-01-25
    • 2014-02-01
    • 2022-01-22
    • 2016-03-14
    • 1970-01-01
    • 2018-01-08
    • 1970-01-01
    • 1970-01-01
    • 2020-11-10
    相关资源
    最近更新 更多