2013-08-27 37 views
1

为下表:添加唯一约束基于字段值

enter image description here

我想补充一个约束,如果IsBanned标志设置为true,则BannedOn字段不能为空(不能被设置为空)。

如何在MySQL中执行此操作?这里是我的CREATE语法:

CREATE TABLE IF NOT EXISTS `fa_ranking_system`.`Player` (
    `PlayerID` INT NOT NULL AUTO_INCREMENT, 
    `FK_ServerID` INT NOT NULL, 
    `PlayerName` VARCHAR(15) NOT NULL, 
    `RegDate` DATETIME NOT NULL, 
    `IsBanned` TINYINT(1) NOT NULL, 
    `LastUpdatedOn` DATETIME NOT NULL, 
    `LastUpdatedBy` VARCHAR(20) NOT NULL, 
    `BannedOn` DATETIME NULL, 
    PRIMARY KEY (`PlayerID`, `FK_ServerID`), 
    INDEX `fk_Player_Server_idx` (`FK_ServerID` ASC), 
    CONSTRAINT `fk_Player_Server` 
    FOREIGN KEY (`FK_ServerID`) 
    REFERENCES `fa_ranking_system`.`Server` (`ServerID`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
+0

这将是一个'CHECK'约束,而不是'UNIQUE'约束(标准SQL),但它们在MySQL中不受支持。 –

回答

4

其实,你可以不 DDL语法定义条件的结构。你的字段可以是NULLNOT NULL - 有没有第三个选择(它不能在结构取决于另一场)的

但你仍然可以通过触发模拟所需的行为。如果传入数据在逻辑上无效,则可以中断UPDATE/INSERT声明。这可以通过:

CREATE TRIGGER `bannedOnCheck` 
BEFORE INSERT ON `fa_ranking_system`.`Player` 
FOR EACH ROW 
BEGIN 
    IF(new.IsBanned && new.BannedOn IS NULL) THEN 
    SIGNAL 'Integrity check failed: can not set banned without ban date' 
    END IF 
END