Mysql 如何引用列的查询值与存储值?
我为标题道歉,我找不到一个好的方式来表达我的问题。我对SQL非常陌生 本质上,我正在创建这个表ID实际上引用了students表,但我在这里对它进行了简化:Mysql 如何引用列的查询值与存储值?,mysql,sql,Mysql,Sql,我为标题道歉,我找不到一个好的方式来表达我的问题。我对SQL非常陌生 本质上,我正在创建这个表ID实际上引用了students表,但我在这里对它进行了简化: CREATE TABLE followers (student_id int not null, followee_id int not null, followsback boolean,
CREATE TABLE followers (student_id int not null,
followee_id int not null,
followsback boolean,
PRIMARY KEY(student_id, followee_id)
SET followsback = IF(SELECT from followers
WHERE student_id = followee_id AND
followee_id = student_id, 1, 0)
我的问题在于IF语句。假设我运行了此插入查询:
INSERT into followers(student_id, followee_id) values(001,002)
这应该存储学生001跟随学生002
我需要选择followee 002并检查他们是否在跟踪学生001。为此,我需要检查followers表中是否有student_id=followee_id的用户,例如student_id=002,然后检查该用户002是否在跟踪原始student_id 001
问题是我不知道如何引用INSERT查询中指定的学生id,而不是SELECT查询中的值
如果两个学生互相跟踪,那么我需要将followsback设置为1
希望这是有意义的,我很难解释清楚这一点。MySQL的CREATETABLE语句中没有语法来完成您所展示的内容。除了市场上没有实现此功能的SQL数据库外,它可以通过SQL规范中一个罕见的称为断言的功能来实现 您可以尝试将其作为触发器来实现:
CREATE TRIGGER followback_ins BEFORE INSERT ON followers
FOR EACH ROW
SET NEW.followsback = EXISTS (
SELECT * from followers
WHERE student_id = NEW.followee_id AND followee_id = NEW.student_id);
但这有一个问题。它只更新新记录的回溯,而不是原始记录
mysql> insert into followers set student_id = 123, followee_id = 456;
mysql> insert into followers set student_id = 456, followee_id = 123;
mysql> select * from followers;
+------------+-------------+-------------+
| student_id | followee_id | followsback |
+------------+-------------+-------------+
| 123 | 456 | 0 |
| 456 | 123 | 1 |
+------------+-------------+-------------+
这被称为异常,因为当您试图在两个位置存储相同的事实时,这两行可能相互矛盾
我们也可以尝试创建一个触发器来更新原始行:
在跟随器上插入后创建触发器跟随器
每行
将追随者更新为f1将追随者加入为f2
在f1上。学生id=f2.followee\U id和f1.followee\U id=f2.student\U id
设置f1.followsback=true,f2.followsback=true
但这是非法的。您不能从同一个表上的触发器更新该表,因为无限递归的风险太大
ERROR 1442 (HY000): Can't update table 'followers' in stored function/trigger
because it is already used by statement which invoked this stored
function/trigger.
我建议不要再存储followsback了。相反,只需将以下关系存储为两行,不包含followsback列。如果要知道它们是否相互跟随,必须将两行连接在一起:
SELECT COUNT(*)
FROM followers AS f1 JOIN followers AS f2
ON f1.student_id=f2.followee_id AND f1.followee_id=f2.student_id
WHERE f1.student_id = 123 AND f1.followee_id = 456.
如果没有相互跟踪,此查询将返回0,如果有,则返回2