1

我有这些 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?你能给我解释一下吗?谢谢。

4

2 回答 2

4

更新指令的值 2 (did) 不应该是 4?

不,它是 4,它应该。

因为UPDATESQL 中的语句是一次性操作。这意味着您在同一逻辑阶段拥有的所有表达式都被评估为好像在同一时间点。在您的示例中:

UPDATE discipline 
SET did = did + did 
WHERE did=2;

did等于,4因为表达式did = did + did同时使用值进行评估did = 2

SQL 小提琴演示

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

| DID | CODE | UNIVERSITY | NUMBER_STUDENTS |
---------------------------------------------
|   1 |   BD |         U1 |              30 |
|   3 | SIBD |         U3 |              30 |
|   4 |  IBD |         U2 |              30 | <<<<<

我不明白为什么指令 SELECT SUM (DISTINCT did) 的结果是 6 而不是 9 (1+4+3)。

更新后的值Did将是:

1
3
4

所以:

SELECT SUM(DISTINCT did) 
FROM discipline 

将等于8

SQL 小提琴演示


在您更新的示例中,由于外键约束,您将无法这样做UPDATE did,并且您将遇到异常:

无法删除或更新父行:外键约束失败 ( db_2_65e0c. precedence, CONSTRAINT precedence_ibfk_2FOREIGN KEY ( advanced) REFERENCES discipline( did))

SQL 小提琴演示

在这种情况下,您将需要添加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 小提琴演示(工作)

于 2013-01-10T13:12:43.927 回答
0

正确的结果应该是 8,因为更新后三个值是 (1, 4, 3),所以子值是 8。

于 2013-01-10T13:14:43.377 回答