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 構文で条件構造を定義することはできません。あなたのフィールドは、またはのいずれかです-3NULL番目のオプションはありません(構造内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
于 2013-08-27T08:07:51.287 に答える