簡體   English   中英

在多個外鍵中使用同一列

[英]Using the same column in multiple foreign keys

我的問題與此非常相似: 多列外鍵:將單列設置為空“ON DELETE”而不是全部

我將使用該問題及其代碼。 答案中的代碼正是我正在尋找的解決方案,但是出現了錯誤。

可能會列出學生參加講座,也可以選擇參加其中一個講座小組。 如果講座被刪除,則應刪除所有學生列表及其所有組。 如果一個組被刪除,那么學生仍然應該被列出參加講座,但他們不應該再被分配到一個組中。

以上所有工作。 但是,如果我嘗試更改講座 ID,我希望 studentListed 和組中的引用會相應地更新(On Update Cascade),但是由於某種原因,它在此外鍵約束上失敗:

#1452 - Cannot add or update a child row: a foreign key constraint fails
(`SomeDB`.`studentListed`, CONSTRAINT `studentListed_ibfk_1` FOREIGN KEY (`lectureId`)
REFERENCES `lectures` (`lectureId`) ON DELETE CASCADE ON UPDATE CASCADE)

為什么會發生這種情況? 原因似乎是studentListed 中的lectureId 既是對講座中的lectionId 的引用,又是對組中的lectionId 的引用,后者本身就是一個引用。 有一個更好的方法嗎?

重現的Sql代碼:

CREATE TABLE lectures (
  lectureId INT NOT NULL,
  title VARCHAR(10) NOT NULL,
  PRIMARY KEY (lectureId)
 );

CREATE TABLE groups (
  lectureId INT NOT NULL,
  groupNo INT NOT NULL,
  title VARCHAR(10) NOT NULL,
  PRIMARY KEY (lectureId,groupNo),
  FOREIGN KEY (lectureId) REFERENCES lectures (lectureId)
    ON UPDATE CASCADE ON DELETE CASCADE
 );

CREATE TABLE studentListed (
  studentId INT NOT NULL,
  lectureId INT NOT NULL,
  groupNo INT NULL,
  PRIMARY KEY (studentId,lectureId),
  FOREIGN KEY (lectureId) REFERENCES lectures (lectureId) 
    ON UPDATE CASCADE ON DELETE CASCADE,
  FOREIGN KEY (lectureId,groupNo) REFERENCES groups (lectureId,groupNo)
    ON UPDATE CASCADE ON DELETE CASCADE
 );

CREATE TRIGGER GroupDelete BEFORE DELETE ON groups
FOR EACH ROW
  UPDATE studentListed SET studentListed.groupNo = NULL
    WHERE studentListed.lectureId = OLD.lectureId
    AND studentListed.groupNo = OLD.groupNo;

INSERT INTO lectures
VALUES
(1, "lecture1");

INSERT INTO groups
VALUES
(1, 1, "group1");

INSERT INTO studentListed
VALUES
(1, 1, 1);

UPDATE lectures SET lectureId=2 WHERE lectureId=1; /* Offending line */

您不能更改為 2,因為表中的第一個位置不存在

級聯以另一種方式工作

進一步的 GROUPS 是 mysql 中的保留字,因此應避免使用。

最后我不得不刪除第二個外鍵,因為它已經存在於組中並且是不必要的,因為組中組中的 fpoeign 鍵已經 chekcs 如果存在這樣的演講 ID

外鍵工作示例

CREATE TABLE lectures ( lectureId INT NOT NULL, title VARCHAR(10) NOT NULL, PRIMARY KEY (lectureId) );
\n \n
CREATE TABLE `groups` ( lectureId INT NOT NULL, groupNo INT NOT NULL, title VARCHAR(10) NOT NULL, PRIMARY KEY (lectureId,groupNo), FOREIGN KEY (lectureId) REFERENCES lectures (lectureId) ON UPDATE CASCADE ON DELETE CASCADE );
\n \n
CREATE TABLE studentListed ( studentId INT NOT NULL, lectureId INT NOT NULL, groupNo INT NULL, PRIMARY KEY (studentId,lectureId), #FOREIGN KEY (lectureId) REFERENCES lectures (lectureId) # ON UPDATE CASCADE ON DELETE CASCADE, FOREIGN KEY (lectureId,groupNo) REFERENCES `groups` (lectureId,groupNo) ON UPDATE CASCADE ON DELETE CASCADE );
\n \n
CREATE TRIGGER GroupDelete BEFORE DELETE ON `groups` FOR EACH ROW UPDATE studentListed SET studentListed.groupNo = NULL WHERE studentListed.lectureId = OLD.lectureId AND studentListed.groupNo = OLD.groupNo;
\n \n
INSERT INTO lectures VALUES (1, "lecture1");
\n \n
INSERT INTO `groups` VALUES (1, 1, "group1");
\n \n
INSERT INTO studentListed VALUES (1, 1, 1);
\n \n
UPDATE lectures SET lectureId = 2 WHERE lectureId = 1
\n \n
SELECT * FROM studentListed
\n學生ID | 講座ID | 組號\n --------: |  --------: |  ------:\n         1 |  2 |  1\n
UPDATE lectures SET lectureId=2 WHERE lectureId=1; /* Offending line */
\n \n\n \n

db<> 在這里擺弄

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM