基本上,我需要根据另一个表中列的值更新一个表中的列。这个问题至少在这里被问了几次,每个高票数的答案都要加入这两个表,并根据另一个表中适用列的值在一个表中设置一列的值:
它似乎对我不起作用,要么我没有看到正确的事情,要么我的条件不同。
编辑1 。我没有显示,但supertype
也有一个accounts_id
列,并认为这是我要加入的专栏。
我有一个超类型和子类型表,其中子类型表包含一个名为supertype_id
的第二个字段,它存储超类型记录的PK(如下所示)。
我需要根据超类型表的某些其他属性(即subtype.supertype_id
),使用超类型表PK更新给定子类型记录(即subtype.id=123
)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;
我可能会做类似以下的事情,但问题是这样做,因为它与所有高度投票的答案不同,如果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;
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;
答案 0 :(得分:2)
您需要选择该特定值。如果您有一个存储面粉类型的配方,用作面粉表中的 id,但您有一个允许用户选择类型而不是类型 id 的表单,您可以将用户的选择转换为外部表的id 类似的东西。
UPDATE TableRecipe
SET BakeMinutes = 90,
FlourTypeID = (SELECT FlourTypeID FROM TableFlourTypes WHERE Type = 'AllPurpose')
WHERE RecipeID= 34