默认值
还是拿上次student学生表来举例:
CREATE TABLE `student` (
`student_id` int NOT NULL AUTO_INCREMENT COMMENT '学生编号',
`student_name` varchar(20) NOT NULL COMMENT '学生姓名',
`address` varchar(100) DEFAULT NULL COMMENT '家庭住址',
PRIMARY KEY (`student_id`)
) ENGINE=InnoDB COMMENT='学生表';
[字段名] [字段数据类型] DEFAULT [默认值]
[root@localhost][employee]> ALTER TABLE `student` MODIFY `address` VARCHAR(100) DEFAULT '北京市' COMMENT '家庭住址';
Query OK, 0 rows affected (1.03 sec)
Records: 0 Duplicates: 0 Warnings: 0

[root@localhost][employee]> INSERT INTO `student`(`student_id`, `student_name`) VALUES(0,'王子');
Query OK, 1 row affected (0.02 sec)

如果我们不设置默认值,其实就相当于指定的默认值为NULL,比如student表添加一个extra额外信息字段且没有设置该字段的默认值,那它的默认值就是NULL。


细心的你可能会发现一个现象,使用DDL语句调整字段的默认值时,不会对表中已有数据做修改,并且新增字段也不会对原始数据做修改,插入数据如果指定具体值的话,会按照指定的值进行保存:

由此观之,调整字段默认值、新增有/无默认值字段操作不会对原始数据对应的字段数据造成影响,默认值只对执行完DDL语句之后的新数据生效,如果指定具体值,会按照指定的值进行数据插入。
NOT NULL属性
有时候我们需要要求表中的某些字段中必须有值,不能存放NULL值,那么可以用这样的语法来定义这个字段:
[字段名] [字段数据类型] NOT NULL
CREATE TABLE `student` (
`student_id` int NOT NULL AUTO_INCREMENT COMMENT '学生编号',
`student_name` varchar(20) NOT NULL COMMENT '学生姓名',
`address` varchar(100) DEFAULT NULL COMMENT '家庭住址',
PRIMARY KEY (`student_id`)
) ENGINE=InnoDB COMMENT='学生表';
[root@localhost][employee]> INSERT INTO `student`(`student_id`, `student_name`, `address`, `extra`) VALUES(30002,NULL,'上海市陆家嘴','交换生');
ERROR 1048 (23000): Column 'student_name' cannot be null
[root@localhost][employee]> INSERT INTO `student`(`student_id`, `address`, `extra`) VALUES(30003,'上海市徐汇区','交换生');
ERROR 1364 (HY000): Field 'student_name' doesn't have a default value
主键
主键。一个表最多只能有一个主键,主键的值不能重复,通过主键可以找到唯一的一条记录。如果我们的表中有定义主键的需求可以选用下边这两种方式之一来指定主键:
1、如果主键只是单个字段的话,可以直接在该字段后声明PRIMARY KEY:
CREATE TABLE `student` (
`student_id` INT(11) PRIMARY KEY COMMENT '学生编号',
...
CREATE TABLE `student` (
`student_id` int NOT NULL AUTO_INCREMENT COMMENT '学生编号',
...
PRIMARY KEY (`student_id`)
);
UNIQUE属性
1、为单个字段声明UNIQUE属性,可以直接在该字段后填写UNIQUE或者UNIQUE KEY:
CREATE TABLE `student` (
...
`student_name` varchar(20) UNIQUE/UNIQUE KEY COMMENT '学生姓名',
...
UNIQUE [约束名称] (字段名1, 字段名2, ...)
UNIQUE KEY [约束名称] (字段名1, 字段名2, ...)
UNIQUE属性的情况,必须使用这种单独声明的形式。如果表中为某个字段或者字段组合定义了UNIQUE属性的话,MySQL会对我们插入的记录做校验,如果新插入记录在该字段或者字段组合的值已经在表中存在了,那就会报错。同时还有一点需要注意,如果设置了UNIQUE属性,最好配合NOT NULL属性一起使用,因为MySQL会认定多个NULL值是不重复的。
外键
CONSTRAINT [外键名称] FOREIGN KEY(字段1, 字段2, ...) REFERENCES 父表名(父字段1, 父字段2, ...);
CREATE TABLE `student_score` (
`student_id` INT(11) NOT NULL COMMENT '学生编号',
`subject` VARCHAR(20) NOT NULL COMMENT '学科名',
`score` TINYINT DEFAULT NULL COMMENT '成绩',
PRIMARY KEY (`student_id`,`subject`),
CONSTRAINT FOREIGN KEY(`student_id`) REFERENCES `student`(`student_id`)
) ENGINE=InnoDB COMMENT='学生成绩表';
AUTO_INCREMENT属性
[字段名] [字段数据类型] AUTO_INCREMENT
字段的注释

ZEROFILL属性
CREATE TABLE `zerofill_table` (
`columns1` INT(0) UNSIGNED ZEROFILL,
`columns2` INT(1) UNSIGNED ZEROFILL,
`columns3` INT(2) UNSIGNED ZEROFILL,
`columns4` INT(3) UNSIGNED ZEROFILL,
`columns5` INT(4) UNSIGNED ZEROFILL,
`columns6` INT(5) UNSIGNED ZEROFILL,
`columns7` INT(6) UNSIGNED ZEROFILL,
`columns8` INT(7) UNSIGNED ZEROFILL,
`columns9` INT(11) UNSIGNED,
`columns10` INT UNSIGNED,
`columns11` INT UNSIGNED ZEROFILL
) ENGINE=InnoDB COMMENT='ZEROFILL测试表';
INSERT INTO `zerofill_table` VALUES(8,8,8,8,8,8,8,8,8,8,8);

类型INT后边都加了一个(),()里面的数字就是所谓的显示宽度。显示宽度是在查询语句显示的结果中,如果声明了ZEROFILL属性的整数字段的实际值的位数小于显示宽度时,会在实际值的左侧补0,使补0的位数和实际值的位数相加正好等于显示宽度。
但是,有几点需要注意:
该字段必须是整数类型的;
该字段必须有UNSIGNED ZEROFILL的属性;
该字段的实际值的位数必须小于显示宽度;
在创建表的时候,如果声明了ZEROFILL属性的字段没有声明UNSIGNED属性,那MySQL会为该字段自动生成UNSIGNED属性;
每个整数类型都会有默认的显示宽度。比如TINYINT的默认显示宽度是4,INT的默认显示宽度是(11)... 如果加了UNSIGNED属性,则该类型的显示宽度减1,比如TINYINT UNSIGNED的显示宽度是3,INT UNSIGNED的显示宽度是10;
显示宽度并不会影响实际类型的实际存储空间。显示宽度仅仅是在展示查询结果时,如果整数的位数不够显示宽度的情况下起作用的,并不影响该数据类型要求的存储空间以及该类型能存储的数据范围,也就是说INT(1)和INT(10)仅仅在展示时可能有区别,在别的方面没有任何区别;
只有字段的实际值的位数小于显示宽度时才会补0,实际值的位数大于显示宽度时照原样输出;
只有在查询声明了ZEROFILL属性的字段时,显示宽度才会起作用,否则忽略显示宽度这个东西的存在;
有UNSIGNED ZEROFILL属性的INT(0)和INT,最终显示效果一样。

注意,有的属性是冲突的,一个列不能具有两个冲突的属性,。如一个列不能既声明为PRIMARY KEY,又声明为UNIQUE KEY,不能既声明为DEFAULT NULL,又声明为NOT NULL。大家在使用过程中需要注意这一点。
一张表中只能定义一个主键,却可以定义多个UNIQUE约束。
规定:主键字段不允许存放NULL,而声明了UNIQUE属性的字段可以存放NULL,而且NULL可以重复地出现在多条记录中。
小结
参考资料
* 小孩子4919《MySQL是怎样使用的:从零蛋开始学习MySQL》

end




