【问题标题】:Default value for foreign key column - InnoDB外键列的默认值 - InnoDB
【发布时间】:2014-11-15 01:23:15
【问题描述】:

使用下面的 SQL 小提琴:

http://sqlfiddle.com/#!2/ae0df/1

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='TRADITIONAL,ALLOW_INVALID_DATES';


CREATE TABLE IF NOT EXISTS `vatbands` (
  `vatbands_id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `code` ENUM('A', 'B', 'C', 'D', 'E', 'F') NOT NULL,
  `client_id` INT(11) UNSIGNED NOT NULL,
  PRIMARY KEY (`vatbands_id`, `code`, `client_id`),
  INDEX `vatcode_vatbands` (`code` ASC, `client_id` ASC))
ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS `item` (
  `item_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `client_id` INT(11) UNSIGNED NOT NULL COMMENT 'Customer ID',
  `vatcode` ENUM('A', 'B', 'C', 'D', 'E', 'F') DEFAULT 'A',
  PRIMARY KEY (`item_id`, `client_id`),
  INDEX `vatcode_item` (`vatcode` ASC, `client_id` ASC),
  CONSTRAINT `vatcode_item`
    FOREIGN KEY (`vatcode` , `client_id`)
    REFERENCES `sbs_node`.`vatbands` (`code` , `client_id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

START TRANSACTION;
INSERT INTO `vatbands` (`client_id`, `code`) VALUES ('1', 'A');
INSERT INTO `item` (`client_id`, `vatcode`) VALUES ('1', NULL);
COMMIT;

当指定默认值“A”时,为什么vatcode 列是“null”?

【问题讨论】:

  • 令人毛骨悚然的选民愿意发表评论吗?

标签: mysql innodb default-value


【解决方案1】:

documentation of the ENUM type 声明:

如果声明 ENUM 列允许 NULL,则 NULL 值是 列的有效值,默认值为 NULL。如果一个枚举 列被声明为 NOT NULL,它的默认值是第一个元素 允许值的列表。

您的 INSERT 使用的是 NULL 值:

INSERT INTO `item` (`client_id`, `vatcode`) VALUES ('1', NULL);

将您的 CREATE TABLE 语句更改为

CREATE TABLE IF NOT EXISTS `item` (
  `item_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `client_id` INT(11) UNSIGNED NOT NULL COMMENT 'Customer ID',
  `vatcode` ENUM('A', 'B', 'C', 'D', 'E', 'F') NOT NULL,        -- no default, but NOT NULL           
  PRIMARY KEY (`item_id`, `client_id`),
  INDEX `vatcode_item` (`vatcode` ASC, `client_id` ASC),
  CONSTRAINT `vatcode_item`
    FOREIGN KEY (`vatcode` , `client_id`)
    REFERENCES `vatbands` (`code` , `client_id`)     -- corrected that one too
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

和您的 INSERT 语句:

INSERT INTO `item` (`client_id`, `vatcode`) VALUES ('1', DEFAULT);

要获得您想要的结果,请参阅my updated fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-25
    • 2011-08-06
    • 2015-01-10
    • 2016-04-25
    • 2016-09-01
    • 2014-08-08
    • 2018-09-02
    • 2011-06-14
    相关资源
    最近更新 更多