简单 MySQL 插入带有字符串比较条件的查询
Simple MySQL Insert Query with string comparison condition
我想根据查询本身需要的某些条件向 table 中插入一行。
假设我有两个 tables foo
和 bar
。每个都有一个 id
列。
现在我有了第三个 table myTable
,它可以有指向 foo
或 bar
的外键,但不能同时指向两者。
我的表格
+----+------+--------+--------+
| 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_id
和 bar_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;
时使用 foo
或 bar
作为列名
所以在编造的语言中:
$sql = "INSERT INTO myTable (data, ${my_string}_id ) VALUES ('three', ?)";
$ps = prepare($sql);
$ps->execute($id);
我想根据查询本身需要的某些条件向 table 中插入一行。
假设我有两个 tables foo
和 bar
。每个都有一个 id
列。
现在我有了第三个 table myTable
,它可以有指向 foo
或 bar
的外键,但不能同时指向两者。
我的表格
+----+------+--------+--------+
| 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_id
和 bar_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;
时使用foo
或 bar
作为列名
所以在编造的语言中:
$sql = "INSERT INTO myTable (data, ${my_string}_id ) VALUES ('three', ?)";
$ps = prepare($sql);
$ps->execute($id);