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

时间:2018-03-07 16:57:37

标签: mysql sql

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

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

编辑1 。我没有显示,但supertype也有一个accounts_id列,并认为这是我要加入的专栏。

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

我需要根据超类型表的某些其他属性(即subtype.supertype_id),使用超类型表PK更新给定子类型记录(即subtype.id=123supertype.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;

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

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;

enter image description here

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;

1 个答案:

答案 0 :(得分:2)

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

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