0

私はこのスクリプトを持っています:

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='STRICT_ALL_TABLES';

SET SQL_MODE = `STRICT_ALL_TABLES`;

CREATE TABLE IF NOT EXISTS `w_bank_account` (
  `account_id` INT NOT NULL AUTO_INCREMENT,
  `bank_id` INT(11) NOT NULL,
  `account_number` VARCHAR(20) NOT NULL,
  `account_type` ENUM('1','2') NOT NULL,
  `balance` DECIMAL(19,4) NOT NULL DEFAULT 0,
  `created` TIMESTAMP NOT NULL,
  `modified` TIMESTAMP NULL,
  PRIMARY KEY (`account_id`),
  CONSTRAINT `fk_w_bank_account_n_bank1`
    FOREIGN KEY (`bank_id`)
    REFERENCES `n_bank` (`id`)
    ON DELETE RESTRICT
    ON UPDATE CASCADE)
ENGINE = InnoDB;

CREATE INDEX `fk_w_bank_account_n_bank1_idx` ON `w_bank_account` (`bank_id` ASC);

この2つのクエリを試します:

INSERT INTO `w_bank_account` (`bank_id`, `account_number`, `account_type`, `balance`) VALUES 
(1, '01234567890123456789', '1', 0.0000), 
(1, '01234567890123456789', '6', 0.0000);

そしてそれは機能しますが、2番目の挿入ではaccount_type空のままになります(これはNULLになると思います):-O STRICT_ALL_TABLESSQL_MODEとして設定しているのはなぜですか? フィールドを離れる代わりに、フィールドが最初の値を取得するべきではありませんか? Debian で MySQL 5.5.31 を使用していますENUMNULL

4

1 に答える 1

1

http://dev.mysql.com/doc/refman/5.0/en/enum.html

ENUM に無効な値 (つまり、許可された値のリストに存在しない文字列) を挿入すると、代わりに空の文字列が特別なエラー値として挿入されます。この文字列は、この文字列の数値が 0 であるという事実によって、「通常の」空の文字列と区別できます。これについては後で詳しく説明します。

このトリガー機能を使用できます

     delimiter //
     CREATE TRIGGER upd_check BEFORE UPDATE ON `w_bank_account`
     FOR EACH ROW
     BEGIN
     IF (NEW.`account_type` != '2' AND NEW.`account_type` != '1')
     SET NEW.`account_type` = '1';
     END IF;
     END;//
     delimiter ;
于 2013-08-06T16:21:05.833 に答える