Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何引用列的查询值与存储值?_Mysql_Sql - Fatal编程技术网

Mysql 如何引用列的查询值与存储值?

Mysql 如何引用列的查询值与存储值?,mysql,sql,Mysql,Sql,我为标题道歉,我找不到一个好的方式来表达我的问题。我对SQL非常陌生 本质上,我正在创建这个表ID实际上引用了students表,但我在这里对它进行了简化: CREATE TABLE followers (student_id int not null, followee_id int not null, followsback boolean,

我为标题道歉,我找不到一个好的方式来表达我的问题。我对SQL非常陌生

本质上,我正在创建这个表ID实际上引用了students表,但我在这里对它进行了简化:

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