2014-09-20 82 views
-1

看看下面的SQL小提琴:默认值 - InnoDB的

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

SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0; 
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; 
SET @[email protected]@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 [email protected]_SQL_MODE; 
SET [email protected]_FOREIGN_KEY_CHECKS; 
SET [email protected]_UNIQUE_CHECKS; 

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

为什么vatcode列 '空' 当 'A' 的默认值是指定?

+0

令人毛骨悚然的选民喜欢留言? – Edward 2014-09-20 16:55:20

回答

1

documentation of the ENUM type状态:

如果一个ENUM列声明为允许NULL,NULL值的列 有效值,默认值为NULL。如果ENUM 列被声明为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

+0

不错的,这个作品完美。 – Edward 2014-09-20 18:41:56

+0

不客气! – VMai 2014-09-20 18:45:33