1

对于下表:

在此处输入图像描述

我想添加一个约束,如果 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)
4

1 回答 1

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
于 2013-08-27T08:07:51.287 回答