MySQL 约束

参考

  • 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
);

你可能感兴趣的:(MySQL 约束)