简单 MySQL 插入带有字符串比较条件的查询

Simple MySQL Insert Query with string comparison condition

我想根据查询本身需要的某些条件向 table 中插入一行。

假设我有两个 tables foobar。每个都有一个 id 列。

现在我有了第三个 table myTable,它可以有指向 foobar 的外键,但不能同时指向两者。

我的表格

+----+------+--------+--------+
| id | data | foo_id | bar_id |
+----+------+--------+--------+
|  1 | one  |  NULL  |   5    |
|  2 | two  |   7    |  NULL  |
+----+------+--------+--------+

当我插入 myTable 时,它应该在 foo_id bar_id 但不是 两者...如上面 table 所示。

以下是我尝试处理 either/or 条件的一些查询,但我似乎无法正确处理。我检查了多个线程,我的查询似乎与那里的答案相符。 $my_string 是一个会话变量,用于跟踪要插入的列...它的值是 'foo' 或 'bar'

INSERT INTO myTable (data, if($my_string = foo,foo_id,bar_id)) values ('three',$id);
INSERT INTO myTable (data, (CASE WHEN $my_string IS foo THEN foo_id ELSE bar_id)) VALUES ('three',$id);
/*replacing the IS with an = doesn't change the outcome*/

我也尝试过在字符串周围添加引号和删除引号的变体,但它们似乎并没有改变结果。我不会显示所有变体以使问题尽可能简短

当我删除条件部分并仅插入 data 列时,查询功能正常...所以我确定条件是导致问题的原因。

编辑

没有尝试添加约束。我不担心我会在 foo_idbar_id 中添加两个值...我永远不会在我的应用程序的任何部分这样做。

我有两个会话变量 $id$my_string。我想要一个插入查询:“如果 $my_string = 'foo',则将 $id 插入 foo_id 列。否则将 $id 插入 bar_id ".

我希望这能澄清问题。非常感谢那些已经回答并帮助消除歧义的人。

在 MySQL 8+ 上,您可以通过检查约束实现此逻辑:

ALTER TABLE myTable ADD CONSTRAINT my_check
CHECK (foo_id IS NULL AND bar_id IS NOT NULL OR
       foo_id IS NOT NULL AND bar_id IS NULL);

使用您未指定的应用程序语言在创建 SQL;

时使用 foobar 作为列名

所以在编造的语言中:

  $sql = "INSERT INTO myTable (data, ${my_string}_id ) VALUES ('three', ?)";
  $ps = prepare($sql);
  $ps->execute($id);