mysql - 更新,求和 sql

标签 mysql sql

我有这些 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 同时。

SQL Fiddle Demo

这将使您的表格看起来像:

| 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

SQL Fiddle Demo


在您更新的示例中,您将无法UPDATE did,因为外键约束,您将遇到异常:

Cannot delete or update a parent row: a foreign key constraint fails (db_2_65e0c.precedence, CONSTRAINT precedence_ibfk_2 FOREIGN KEY (advanced) REFERENCES discipline (did))

SQL Fiddle Demo

在这种情况下,您需要将 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

SQL fiddle demo of the two table(working)

关于mysql - 更新,求和 sql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14258603/

相关文章:

sql - 使用 INNER JOIN 从 2 个表中删除

php - 比较两个不同类型的数据库表并比较它们的数据的最佳方法?

php - Laravel MySQL 使用 eloquent 应用产品过滤器(正确的查询是什么?)

php - mysqli_query 返回不满足条件

更新字符串中三个字符的 SQL 语句

sql - 如何在 SQLite 中生成时间间隔查询?

php - 未使用准备好的语句存储的数据

mysql - Rails Mysql::错误:查询:未连接 Windows 7

sql - 带有 TimescaleDB 的 PostgreSQL 在索引创建期间仅使用单个核心

mysql - 从 SQL 中选择最佳结果