【问题标题】:Insert values only if an id exists in another table仅当 id 存在于另一个表中时才插入值
【发布时间】:2013-09-11 17:12:10
【问题描述】:

基本上,以下是我想做的:

INSERT INTO table
(
    column1, column2
)
VALUES
(
    ?, ?
)
WHERE EXISTS
(
    SELECT 1
    FROM table2
    WHERE id = ?
)

换句话说:如果table2中存在id,则应该插入值,否则不会发生任何事情。

这个任务的正确语法是什么?

【问题讨论】:

标签: php mysql sql insert


【解决方案1】:

我知道这是一个非常古老的问题,但我的一个朋友帮助建立了一个带有“约束”的数据库,其中插入或更新必须有 1 个值与来自不同表中的一个值匹配完全相同的数据库才能启动。

我对 MySQL 调用还不是很擅长,所以我不明白它到底做了什么……但它可以帮助您减少执行所需操作所需的代码? (注意:我不得不对其进行一些修改以从中删除一些敏感名称等,但它应该是一个很好的表示。)

-- -----------------------------------------------------
-- Table `db1`.`table1`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `db1`.`table1` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `av_key` VARCHAR(40) NOT NULL ,
  PRIMARY KEY (`id`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `db1`.`table2`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `db1`.`table2` (
  `bkid` INT NOT NULL AUTO_INCREMENT ,
  `id` INT NOT NULL ,
  `data` VARCHAR(6144) NULL ,
  PRIMARY KEY (`bkid`) ,
  INDEX `id_idx` (`id` ASC) ,
  CONSTRAINT `id`
    FOREIGN KEY (`id` )
    REFERENCES `db1`.`table1` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

有了这个,你只需要执行插入/更新语句,如果两个表中的“id”都没有匹配,它就会失败。

不知道您是否已经发现或者这是否是您需要的,但认为值得分享!

【讨论】:

    【解决方案2】:

    我没有可用的 mysql 数据库,但与其他数据库类似,阅读参考后它一定是这样的

    INSERT INTO table (column1, column2)
        SELECT ?, ? FROM table2 WHERE id=?
    

    【讨论】:

      【解决方案3】:

      我发现这可以满足我的需要。

      INSERT INTO table1
      (
          column1, column2
      )
      SELECT ?, ?
      FROM
      table2
      WHERE EXISTS
      (
          SELECT 1
          FROM table2
          WHERE id = ?
      )
      LIMIT 1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-29
        相关资源
        最近更新 更多