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

带字符串比较条件的简单MySQL插入查询,mysql,insert,Mysql,Insert,我想根据查询本身所需的某些条件在表中插入一行 假设我有两个表foo和bar。每个都有一个id列 现在我有了第三个表myTable,它可以有一个外键指向foo或bar,但不能同时指向两者 myTable +----+------+--------+--------+ | id | data | foo_id | bar_id | +----+------+--------+--------+ | 1 | one | NULL | 5 | | 2 | two | 7

我想根据查询本身所需的某些条件在表中插入一行

假设我有两个表
foo
bar
。每个都有一个
id

现在我有了第三个表
myTable
,它可以有一个外键指向
foo
bar
,但不能同时指向两者

myTable

+----+------+--------+--------+
| id | data | foo_id | bar_id |
+----+------+--------+--------+
|  1 | one  |  NULL  |   5    |
|  2 | two  |   7    |  NULL  |
+----+------+--------+--------+
当我插入到
myTable
中时,它应该在中有一个外键,要么在foo\u id中,要么在中,要么在中,要么在中,要么在中,要么在中,要么在中插入一个外键,要么在中插入一个外键。。。如上表所示

下面是我试图处理条件的一些查询,但我似乎无法正确处理。我检查了多个线程,我的查询似乎与那里的答案相匹配
$my_string
是一个会话变量,用于跟踪要插入的列。。。其值为“foo”或“bar”

INSERT INTO myTable (data, if($my_string = foo,foo_id,bar_id)) values ('three',$id);
我也尝试过在字符串周围添加引号并删除它们,但它们似乎不会改变结果。为了使问题尽可能简短,我不会展示所有的变体

当我删除条件部分并仅插入
数据
列时,查询功能正常。。。所以我肯定是这种情况导致了这个问题

编辑

我不是在尝试添加约束。我不怕我会给
foo\u id
bar\u id
添加两个值。。。我不会在我申请的任何部分这样做

我有两个会话变量
$id
$my_string
。我需要一个insert查询,该查询显示:“如果
$myu string
='foo',则将
$id
插入列
foo\u id
。否则,将
$id
插入
bar\u id


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

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

ALTER TABLE myTable ADD CONSTRAINT my\u check
检查(foo_id为NULL,bar_id不为NULL或
foo_id不为空,bar_id为空);

使用未指定的应用程序语言,在创建SQL时使用
foo
bar
作为列名

所以用一种虚构的语言:

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

看,这将是一个很好的补充,但遗憾的是没有回答我的问题。我需要知道在哪个列中输入$id。我不相信约束能帮我做到这一点。你的评论毫无意义。你不明白什么?我有一个名为$id的变量(整数),它等于
foo
bar
中一行的PK。我需要知道在运行时将哪个列插入到$id中。。。所以我尝试使用一个条件。什么东西这么难理解?其他人也提出了同样的解决方案。我的问题可能有误导性,所以我可能会发布一个更强调这个问题的重新措辞的版本。这解决了问题,但我仍然想看看如何使用SQL来实现。如果没有人回答,我最好回答这个问题。感谢MySQL不支持列名称的动态规范(这同样适用于我能想到的所有语法)。请原谅初学者的问题。。。但是为什么SELECT语句支持“动态指定列名”,而INSERT语句不支持?我在SELECT语句中成功地使用了CASE语句,所以我认为INSERT语句的功能类似。SELECT语句中的结果是表达式。在
INSERT
的语法中,它们被指定为列名。从某种意义上说,
select
表达式在返回的每一行都会被计算,但是
INSERT
并没有设置为动态更改其插入的列。
  $sql = "INSERT INTO myTable (data, ${my_string}_id ) VALUES ('three', ?)";
  $ps = prepare($sql);
  $ps->execute($id);