如何更新一个主键是另一个表的主键的表?

Posted

技术标签:

【中文标题】如何更新一个主键是另一个表的主键的表?【英文标题】:How to update a table whose primary key is the primary key in another table? 【发布时间】:2019-11-28 22:01:19 【问题描述】:

我有这两张桌子:

CREATE TABLE COPIE(IDC VARCHAR2(10) PRIMARY KEY,
                   ETAT CHAR(1)
                     CHECK (ETAT IN ('M','P','D')),
                   IDO VARCHAR2(10) REFERENCES OUVRAGE(IDO));

CREATE TABLE PRET(IDC VARCHAR2(10) REFERENCES COPIE(IDC),
                  IDE REFERENCES ETUDIANT(IDE),
                  DATEP DATE,
                  DATER DATE,
                  AVIS VARCHAR2(7)
                    CHECK (AVIS IN ('LIKE','DISLIKE')),
                  IDB VARCHAR2(10) REFERENCES BIBLIO(IDB),
                  PRIMARY KEY(IDC,IDE,DATEP));

所以基本上我试图创建一个更新 TABLE COPIE 中的 ETAT 的过程,其中它的 datep 不为空且 dater 为空(在表 pret 中)

【问题讨论】:

【参考方案1】:

据我了解你的问题,你可以使用merge如下:

Merge into copie c
Using (select * from pret
       Where dater is null and datep is not null) t
On (c.idc = t.idc)
When matched then 
Update set c.etat = <value whichever you want>

或者你可以直接使用update语句作为

Update copie c 
Set c.etat = <value whichever you want>
Where c.idc in 
   (select t.idc
      From pret t
     Where dater is null 
       and datep is not null)

干杯!!

【讨论】:

【参考方案2】:

IDC 是两个表中的主键或主键的一部分这一事实确实不应该成为问题。如果你想更新COPIE.ETAT你应该可以说

UPDATE COPIE
  SET ETAT = 'M'
  WHERE IDC = 'whatever'

这不会影响表PRET 中的任何内容,因为您没有更改IDC 字段,并且ETAT 字段没有被PRET 引用。

【讨论】:

所以我可以在 boht 中使用 IDC 加入这两个表并且仍然能够更新 ETAT ? Oracle 不允许在 UPDATE 语句中使用连接,而且您的问题显然没有解决这个问题。请使用edit 按钮(就在问题标签下方)编辑您的问题,并描述您实际尝试执行的操作。谢谢。

以上是关于如何更新一个主键是另一个表的主键的表?的主要内容,如果未能解决你的问题,请参考以下文章

请问SQL server 中的主键和外键的作用

外键为啥不一定与相应的主键重名

数据库中,主键是不能重复,唯一的,请问外键是否也不能重复的??

主键和外键的作用

如何分清SQL数据库中的主键与外键

SQL中主键和外键的定义是啥???