繁体   English   中英

使用另一个表的主键更新外键列

[英]Update foreign key column with another table's primary key

基本上,我需要根据另一个表中一列的值更新一个表中的一列。 这个问题在这里至少被问过几次,每个高票数的答案都表明加入两个表并根据另一个表中适用列的值设置一个表中列的值:

它似乎对我不起作用,要么我没有看到正确的事情,要么我的条件不同。

编辑 1 我没有展示它,但supertype也有一个accounts_id列,我认为这是我将加入的列。

我有一个超类型和子类型表,其中子类型表包括一个名为supertype_id的第二个字段,它存储超类型记录的 PK(如下所示的架构)。

我需要更新subtype.supertype_id对于给定的子类型的记录(即subtype.id=123基于超类型表的一些其他属性与超类型表的PK)(即supertype.publicId=321 )。

所以,我最初认为我需要某种 JOIN,但是,由于 JOIN 尚不存在,因此没有更新任何行。

UPDATE subtype
INNER JOIN supertype ON supertype.id=subtype.id
SET subtype.supertype_id=supertype.id
WHERE subtype.id=123 AND supertype.idPublic=321;

UPDATE subtype
INNER JOIN supertype ON supertype.id=subtype.id AND supertype.idPublic=321
SET subtype.supertype_id=supertype.id
WHERE subtype.id=123;

我可能会做类似以下的事情,但是,这样做的问题是因为它不同于所有高投票的答案,并且如果supertype没有给定idPublic的记录,它还会尝试将suptype.supertype_id设置为NULL ,这将导致外键约束。

UPDATE subtype SET supertype_id = SELECT id FROM superset WHERE idPublic=321;

这应该如何实施?

编辑 2 也许是这样的?

UPDATE suptype sbt
INNER JOIN supertype spt1 ON spt1.id=sbt.id
INNER JOIN supertype spt2 ON spt2.accounts_id=spt1.accounts_id
SET sbt.supertype_id =sbt2.id
WHERE sbt2.idPublic=321 AND sbt.id=123;

在此处输入图片说明

CREATE TABLE supertype (
  id INT NOT NULL AUTO_INCREMENT,
  data VARCHAR(45) NULL,
  publicId INT NOT NULL,
  PRIMARY KEY (id),
  INDEX publicIdIdx (publicId ASC))
ENGINE = InnoDB;

CREATE TABLE subtype (
  id INT NOT NULL,
  supertype_id INT NOT NULL,
  data VARCHAR(45) NULL,
  PRIMARY KEY (id),
  INDEX fk_subtype_supertype1_idx (supertype_id ASC),
  CONSTRAINT fk_subtype_supertype
    FOREIGN KEY (id)
    REFERENCES supertype (id)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT fk_subtype_supertype1
    FOREIGN KEY (supertype_id)
    REFERENCES supertype (id)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

您需要选择该特定值。 如果您有一个存储面粉类型的配方,用作面粉表中的 id,但您有一个允许用户选择类型而不是类型 id 的表单,您可以将用户的选择转换为外部表的id 类似的东西。

UPDATE TableRecipe
SET BakeMinutes = 90,
    FlourTypeID = (SELECT FlourTypeID FROM TableFlourTypes WHERE Type = 'AllPurpose')
WHERE RecipeID= 34

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM