2013-08-27 2 views
1

Для следующей таблицы:Добавить уникальное ограничение на основе значения поля

enter image description here

Я хотел бы добавить ограничение, если IsBanned флаг установлен в истинное поле BannedOn не может быть оставлено пустым (не может будет установлено значение null).

Как это сделать в MySQL? Вот мой СОЗДАТЬ синтаксис:

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. Ваше поле может быть либо NULL или NOT 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 
Смежные вопросы