参考
- NOT NULL - 指示某列不能存储 NULL 值。
- UNIQUE - 保证某列的每行必须有唯一的值。
- PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
- FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
- CHECK - 保证列中的值符合指定的条件。
- DEFAULT - 规定没有给列赋值时的默认值。
- AUTO_INCREMENT - 自增
UNSIGNED
无符号,与 INT FLOAT 等数值类型结合使用,指定表示数值的范围不包括负数。
CREATE TABLE `test`(
`id` INT UNSIGNED
);
ZEROFILL
填充,与 INT(size) FLOAT(size, d) 等数值类型结合使用,当整数的位数小于 size 时候,填充 0。
CREATE TABLE `test`(
`id` INT(5) ZEROFILL,
`price` DEC(10, 2) ZEROFILL
);
DEFAULT
在插入数据或者修改数据的时候,没有为某个字段指定值,则使用该字段的默认值。
可以通过 DEFAULT 来设置默认值
CREATE TABLE `test`(
`name` VARCHAR(16) DEFAULT '匿名用户'
);
没有通过 DEFAULT 来指定默认值,则相当于 DEFAULT NULL
CREATE TABLE `test`(
`name` VARCHAR(16)
);
相当于
CREATE TABLE `test`(
`name` VARCHAR(16) DEFAULT NULL
);
此时在插入数据或者修改数据的时候,没有为 name 字段指定值,则使用 NULL。
NOT NULL
在插入数据或者修改数据的时候,指定了 NOT NULL 的字段必须指定值,不能省略。
CREATE TABLE `test`(
`name` VARCHAR(16) NOT NULL,
`title` VARCHAR(64)
);
INSERT INTO `test` (title) VALUES ('Hello MySQL');
报错:Query 1 ERROR: Field 'name' doesn't have a default value
可以为 NOT NULL 的字段通过 DEFAULT 指定非 NULL 的默认值,这样在插入数据或者修改数据的时候,可以省略该字段的值。
CREATE TABLE `test`(
`name` VARCHAR(16) NOT NULL DEFAULT '匿名用户',
`title` VARCHAR(64)
);
INSERT INTO `test` (title) VALUES ('Hello MySQL');
成功插入一条记录,name 字段值为 '匿名用户',title 字段值为 'Hello MySQL'。
NOT NULL DEFAULT 和 DEFAULT 是有区别的:
CREATE TABLE `test` (
`name` varchar(16) NOT NULL DEFAULT '匿名用户',
`title` varchar(64) DEFAULT '默认标题'
)
以上 name 和 title 字段都有默认值,因此在不指定他们的时候,会使用默认值。
INSERT INTO `test` VALUES ();
以上成功插入一条记录,name 为 '匿名用户',title 为 '默认标题'。
当手动指定值的时候,name 不能指定为 null,title 可以指定为 null
INSERT INTO `test` VALUES
(null, null);
报错:Query 1 ERROR: Column 'name' cannot be null
INSERT INTO `test` VALUES
('张三', null);
成功插入数据
UNIQUE
唯一,不能重复,但是可以插入重复的 NULL。
CREATE TABLE `test` (
`name` varchar(16) UNIQUE
)
INSERT INTO `test` VALUES (NULL), (NULL), (NULL);
插入三条记录,每条记录的 name 字段都为 NULL。
AUTO_INCREMENT
自增,只能有一个字段被定义为 AUTO_INCREMENT,并且该字段必须是主键,否则报错。
CREATE TABLE `test2`(
`id` INT PRIMARY KEY,
`total` INT AUTO_INCREMENT
);
Query 1 ERROR: Incorrect table definition; there can be only one auto column and it must be defined as a key
默认地,AUTO_INCREMENT 的开始值是 1,每条新记录递增 1,如果想要以其他值作为开始值,如下设置:
CREATE TABLE `test` (
`id` INT AUTO_INCREMENT,
`name` VARCHAR(32),
PRIMARY KEY (`id`)
)
ALTER TABLE `test` AUTO_INCREMENT=100;
PRIMARY KEY
- 字段如果没设置 NOT NULL,则自动添加 DEFAULT NULL
- 字段设置了 NOT NULL,不会再自动添加 DEFAULT
- 主键,自动设置 NOT NULL
- 主键,不会自动设置 UNIQUE,但是仍然要唯一值
- 一个表只能有一个主键
CREATE TABLE `test` (
`id` int(11),
`name` varchar(16),
PRIMARY KEY (`id`)
)
以上设置会自动转换为以下设置,查看
SHOW CREATE TABLE `test`;
显示:
CREATE TABLE `test` (
`id` int(11) NOT NULL,
`name` varchar(16) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
FOREIGN KEY
参考
一个表中的 FOREIGN KEY 指向另一个表中的 UNIQUE KEY(唯一约束的键)。外键的表示子表,主键的表是父表。
CREATE TABLE `user` (
`id` INT,
`name` VARCHAR(32),
PRIMARY KEY (`id`)
)
CREATE TABLE `post`(
`id` INT,
`title` VARCHAR(32),
`content` TEXT,
`author` INT,
PRIMARY KEY (`id`),
FOREIGN KEY (`author`) REFERENCES `user` (`id`)
);
ON DELETE 和 ON UPDATE 约束,默认为 NO ACTION,子表中存在对应外键的记录,父表不能删除和修改对应的记录。
CREATE TABLE `post`(
`id` INT,
`title` VARCHAR(32),
`content` TEXT,
`author` INT,
PRIMARY KEY (`id`),
FOREIGN KEY (`author`)
REFERENCES `user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION
);
ON DELETE CASCADE 和 ON UPDATE CASCADE,删除/修改父表记录的时候,级联删除/修改子表对应记录。
CREATE TABLE `post`(
`id` INT,
`title` VARCHAR(32),
`content` TEXT,
`author` INT,
PRIMARY KEY (`id`),
FOREIGN KEY (`author`)
REFERENCES `user` (`id`)
ON DELETE CASCADE
ON UPDATE CASCADE
);
ON DELETE SET NULL 和 ON UPDATE SET NULL,删除/修改父表记录的时候,将字表对应外键设置为 NULL。
CREATE TABLE `post`(
`id` INT,
`title` VARCHAR(32),
`content` TEXT,
`author` INT,
PRIMARY KEY (`id`),
FOREIGN KEY (`author`)
REFERENCES `user` (`id`)
ON DELETE SET NULL
ON UPDATE SET NULL
);