2015-09-04 388 views
0

我得到了一張表user,一張表assignment和一張表candidation(帶有一個主要的,而不是自然的),它有兩個外鍵。它們都是1:nc,表示不一定有用戶進行候選(用戶刪除)或分配(分配已刪除)。我如何避免在mysql中有兩個外鍵的空值?

現在我怎麼能避免在中有NULL這兩個外鍵?

USER:

-- Table `Ressource-Management`.`user` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `Ressource-Management`.`user` (
    `iduser` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '', 
    `name_first` VARCHAR(50) NOT NULL COMMENT '', 
    `name_last` VARCHAR(50) NOT NULL COMMENT '', 
    `attendance` INT UNSIGNED NOT NULL COMMENT '', 
    `can_own` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '', 
    PRIMARY KEY (`iduser`) COMMENT '') 
ENGINE = InnoDB; 

作業:

-- ----------------------------------------------------- 
-- Table `Ressource-Management`.`assignment` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `Ressource-Management`.`assignment` (
    `idassignment` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '', 
    `owner` INT UNSIGNED NOT NULL COMMENT '', 
    `budget` INT UNSIGNED NOT NULL COMMENT '', 
    `priority` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '', 
    `date_to` DATETIME NULL COMMENT '', 
    PRIMARY KEY (`idassignment`) COMMENT '', 
    INDEX `fk_assignment_user_idx` (`owner` ASC) COMMENT '', 
    CONSTRAINT `fk_assignment_user` 
    FOREIGN KEY (`owner`) 
    REFERENCES `Ressource-Management`.`user` (`iduser`) 
    ON DELETE RESTRICT 
    ON UPDATE CASCADE) 
ENGINE = InnoDB; 

CANDIDATION:

-- ----------------------------------------------------- 
-- Table `Ressource-Management`.`candidation` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `Ressource-Management`.`candidation` (
    `idcandidation` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '', 
    `user_iduser` INT UNSIGNED NULL COMMENT '', 
    `assignment_idassignment` INT UNSIGNED NULL COMMENT '', 
    `date_from` DATETIME NOT NULL COMMENT '', 
    `date_to` DATETIME NOT NULL COMMENT '', 
    `status` LONGBLOB NULL DEFAULT offen COMMENT '', 
    `message` VARCHAR(4096) NULL COMMENT '', 
    PRIMARY KEY (`idcandidation`) COMMENT '', 
    INDEX `fk_user_has_assignment_assignment1_idx` (`assignment_idassignment` ASC) COMMENT '', 
    INDEX `fk_user_has_assignment_user1_idx` (`user_iduser` ASC) COMMENT '', 
    UNIQUE INDEX `user_assignment_UNIQUE` (`user_iduser` ASC, `assignment_idassignment` ASC) COMMENT '', 
    CONSTRAINT `fk_user_has_assignment_user1` 
    FOREIGN KEY (`user_iduser`) 
    REFERENCES `Ressource-Management`.`user` (`iduser`) 
    ON DELETE SET NULL 
    ON UPDATE CASCADE, 
    CONSTRAINT `fk_user_has_assignment_assignment1` 
    FOREIGN KEY (`assignment_idassignment`) 
    REFERENCES `Ressource-Management`.`assignment` (`idassignment`) 
    ON DELETE SET NULL 
    ON UPDATE CASCADE) 
ENGINE = InnoDB; 
+0

你可以在外部表'tableA'的一個創建觸發器和丟棄刪除,如果已經在其他創建觸發器一個'tableB'是'NULL'。 –

+0

@JuanCarlosOropeza需要兩張桌子才能生效。 _But ..我不喜歡觸發器.._ – inetphantom

回答

0

一個posibility是對缺失,在那裏我放棄刪除,如果已經是另一個關鍵是NULL

1

如果導致空值的唯一原因是刪除記錄,則使用邏輯刪除:向兩個表中添加標記isDeleted,並將candidation中的外鍵字段設置爲NOT NULL

+0

這是一個很好的方面。另外,如果我想這樣做,我可以使用'ON DELETE CASCADE'來刪除所有三個。 – inetphantom

+0

它取決於上下文。也許這是一個有價值的信息,知道你刪除多少條目,所以邏輯刪除就足夠了。我也會添加字段來存儲創建和修改時間戳,以便您可以跟蹤記錄被標記爲已刪除的時間。 – Paolo