美文网首页
MySQL 约束

MySQL 约束

作者: _于曼丽_ | 来源:发表于2022-05-15 16:47 被阅读0次

参考

  • 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 学习语句

    MySQL学习笔记 登录和退出MySQL服务器 基本语法 建表约束 主键约束 唯一主键 非空约束 默认约束 外键约...

  • mysql约束

    1, mysql 不支持外键约束 ,条件约束约束分为列级约束,primary 主键约束check 条件约束for...

  • MySQL基础——约束

    上篇文章我们学习了MySQL基础——函数,这篇文章我们学习MySQL基础——约束。 约束 约束是作用于表中字段上的...

  • mysql 约束

    接下来的一些内容,我们需要提前学一些简单的sql语句,方便大家理解接下来的知识。 DDL—数据定义语言(Creat...

  • MySQL约束

    mysql约束 1. 约束简介 关系型数据库系统和文件系统的一个不同点是,关系型数据库本身能保证存储数据的完整性,...

  • MySQL约束

    概念: 为了保证数据的完整性和一致性,MySQL提供了约束这个属性。约束分为表级约束和列级约束,如果约束只是针对某...

  • mySQl约束

    MYSQL的五种约束

  • MySQL约束

    PRIMARY KEY 主键 修改 删除 UNIQUE 唯一 添加 删除 FOREIGN KEY 修改 删除 删除...

  • mysql 约束

    主键约束表的主键设计策略任意两行都不具备相同的主键值每行都必须有一个主键值(主键不允许null列)主键和业务无关,...

  • MySQL约束

    1、NOT NULL 非空约束----字面意思 2、PRIMARY KEY 主键约束 3、UNIQUE KEY 唯...

网友评论

      本文标题:MySQL 约束

      本文链接:https://www.haomeiwen.com/subject/pxovurtx.html