我有这些 SQL 指令:
CREATE TABLE discipline (
did INT PRIMARY KEY,
code VARCHAR(127) UNIQUE,
university VARCHAR(127),
number_students INT
) ENGINE=INNODB;
CREATE TABLE precedence(
type VARCHAR(127),
basic INT,
advanced INT,
PRIMARY KEY (basic, advanced),
FOREIGN KEY (basic) REFERENCES discipline(did) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (advanced) REFERENCES discipline(did)
)ENGINE=INNODB;
INSERT INTO discipline VALUES (1,'BD','U1',30);
INSERT INTO discipline VALUES (2,'IBD','U2',30);
INSERT INTO discipline VALUES (3,'SIBD','U3',30);
INSERT INTO precedence VALUES ('optional',1,2);
INSERT INTO precedence VALUES ('mandatory',2,3);
UPDATE discipline SET did=did+did WHERE did=2;
我不明白为什么指令 SELECT SUM (DISTINCT did)
的结果是 6 而不是 8 (1+4+3)。带有更新指令的值 2
(did) 不应该是 4
?你能给我解释一下吗?谢谢。
最佳答案
The value 2 (did) with the update instruction shouldn't be 4?
不,它是 4,它应该。
因为 SQL 中的 UPDATE
语句是All-at-once 操作。这意味着您在同一逻辑阶段拥有的所有表达式都被评估为好像在同一时间点。在你的例子中:
UPDATE discipline
SET did = did + did
WHERE did=2;
did
将等于 4
,因为表达式 did = did + did
的计算值为 did = 2
同时。
这将使您的表格看起来像:
| DID | CODE | UNIVERSITY | NUMBER_STUDENTS |
---------------------------------------------
| 1 | BD | U1 | 30 |
| 3 | SIBD | U3 | 30 |
| 4 | IBD | U2 | 30 | <<<<<
I don't understand why the result of the instruction SELECT SUM (DISTINCT did) is 6 and isn't 9 (1+4+3).
更新后 Did
的值将是:
1
3
4
因此:
SELECT SUM(DISTINCT did)
FROM discipline
将等于 8
。
在您更新的示例中,您将无法UPDATE did
,因为外键约束,您将遇到异常:
Cannot delete or update a parent row: a foreign key constraint fails (
db_2_65e0c
.precedence
, CONSTRAINTprecedence_ibfk_2
FOREIGN KEY (advanced
) REFERENCESdiscipline
(did
))
在这种情况下,您需要将 ON DELETE CASCADE ON UPDATE CASCADE
添加到其他外键约束:
FOREIGN KEY (advanced) REFERENCES discipline(did)
然后是 UPDATE
:
UPDATE discipline
SET did=did + did
WHERE did=2;
将与之前解释的相同,并且
SELECT SUM(DISTINCT did)
FROM discipline
将等于 8
。
关于mysql - 更新,求和 sql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14258603/