根据字段值添加唯一约束

时间:2013-08-27 07:53:56

标签: mysql sql datetime constraints

对于下表:

enter image description here

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

我如何在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)

1 个答案:

答案 0 :(得分: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