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です。そうする必要があります。

SQLのUPDATEステートメントは、All-at-once操作であるためです。つまり、同じ論理フェーズにあるすべての式は、同じ時点にあるかのように評価されます。あなたの例では:

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

式が値と同時に評価されるため、didはに等しくなります。4did = did + diddid = 2

SQLフィドルデモ

これにより、テーブルは次のようになります。

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

SELECT SUM命令(DISTINCTが行った)の結果が6であり、9(1 + 4 + 3)ではない理由がわかりません。

Did更新後の値は次のようになります。

1
3
4

したがって:

SELECT SUM(DISTINCT did) 
FROM discipline 

に等しくなり8ます。

SQLフィドルデモ


更新された例でUPDATE didは、外部キー制約のためにできなくなり、例外が発生します。

親行を削除または更新できません:外部キー制約が失敗します(db_2_65e0cprecedence、CONSTRAINT precedence_ibfk_2FOREIGN KEY(advanced)REFERENCES disciplinedid))

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ます。

2つのテーブルのSQLフィドルデモ(動作中)

于 2013-01-10T13:12:43.927 に答える
0

更新後、3つの値は(1、4、3)であり、サブ値は8であるため、正しい結果は8になります。

于 2013-01-10T13:14:43.377 に答える