sql键保留表

93ze6v8z  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(467)

我试图通过一个视图更新一个表,但是我不断得到一个错误,即列没有Map到一个键保留的表。有人能解释一下为什么这些表没有保留密钥吗?
我得到的错误是:
sql错误:ora-01779:nãoé poss公司í与表格相对应的修改级别ãoé mantida por chaves,邮编:01779。00000-“无法修改Map到非键保留表的列”原因:试图插入或更新Map到非键保留表的联接视图的列操作:直接修改基础基表。
代码:

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;
kuuvgm7e

kuuvgm7e1#

键保留意味着基表中的行在该表的输出视图中最多出现一次。
(https://asktom.oracle.com/pls/asktom/f?p=100:11¨¨¨¨¨¨:p11(问题编号:548422757486)
现在还不完全清楚,因为您还没有提供所有相关的表定义,但从本质上讲,这个错误表明oracle不能保证 Pessoa 对应于视图中的一行或零行。
Pessoa 以及 Membro 具有相同的主键(顺便说一句,这似乎很奇怪),这可能意味着未描述的表 telemoveis 对于给定的值,可以有多行 cartaoCidadao .

2izufjch

2izufjch2#

membro是此查询中唯一保留键的表。视图中的任何查询最多只能返回membro中每一行的一个副本,但如果pessoa或escalao中的行通过其外键链接到多个membro,则可以返回多个副本。因此它们不是密钥保存的,因此您可能无法更新pessoa.nome。

相关问题