带字符串比较条件的简单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);